Einblick in Java EE 7: JMS 2.0 erleichtert Java Messaging

Hartmut Schlosser

In der Werkstatt der Java-EE-7-Spezifikationen befindet sich auch der Java Message Service (JMS) in Entwicklung. JMS 2.0 soll in Java EE 7 den alten Standard JMS 1.1 ablösen, eine Spezifikation, die bereits 2003 fertiggestellt wurde. Entsprechend groß ist der Innovationsstau geworden, in den letzten fast 10 Jahren hat sich die Java-Landschaft doch deutlich verändert: Annotationen, Generics, Dependency Injection, etc.

Arun Gupta gibt auf seinem Blog nun Einblick in den aktuellen Entwicklungsstand von JMS 2.0. Die allgemeinen Ziele beschreibt er mit:

  • Einfacheres Entwickeln
  • Klare Abgrenzung zwischen JMS und anderen Java-EE-Spezifikationen
  • Definition eines neuen API für die Integration alternativer JMS Provider in beliebige Java EE Applikationsserver
  • Erweiterungen für den Support von Java EE 7

Das „einfachere Entwickeln“ bezieht sich vor allem auf ein vereinfachtes API, mit dem man es als Java-Entwickler meist zu tun haben wird. Gupta gibt anhand des vorliegenden Early Drafts einige Beispiele. Das folgende Codeschnipsel nutzt noch das exisitierende JMS API 1.1:

@Resource(lookup = "jms/connectionFactory ")
ConnectionFactory connectionFactory;

@Resource(lookup="jms/inboundQueue")
Queue inboundQueue;

public void sendMessageOld (String payload) {
 Connection connection = null;
try {
 connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(inboundQueue);
TextMessage textMessage = session.createTextMessage(payload);
messageProducer.send(textMessage);
} catch (JMSException e) {
 // do something
 } finally {
 try {
 if (connection != null)
 connection.close();
 } catch (JMSException e2) {
 // do something else
 }
 }
}  

Natürlich funktioniert hier alles wie gewünscht, Gupta identifiziert aber einige Umständlichkeiten: Vermittelnde Objekte wie Connection, Session und MessageProducer machen die Anwendung kompliziert. Die Argumente für createSession sind verwirrend, wenn das erste Argument „true“ ist, wird das zweite sogar überflüssig. Connection muss im „finally“-Block explizit geschlossen werden, der Block wird beim Abfangen von Exceptions schnell unübersichtlich.

Das Vorher-Nachher-Erlebnis wird durch die Umsetzung desselben Beispiels mit JMS 2.0 komplett:

@Resource(lookup = "jms/connectionFactory")
ConnectionFactory connectionFactory;

@Resource(lookup="jms/inboundQueue")
Queue inboundQueue;

public void sendMessageNew (String payload) {
try (JMSContext context = connectionFactory.createContext();){
context.send(inboundQueue,payload);
}
}  

Hier wird einfach eine ConnectionFactory erzeugt, ein Kontext abgeleitet und die send-Anweisung ausgeführt. Das Ziel wird dabei direkt in send spezifiziert, Connection schließt sich automatisch, Runtime Exceptions werden von eigenen Methoden gebunden.

Noch einfacher wird es mit Dependency Injection:

@Inject
@JMSConnectionFactory("jms/connectionFactory")
private JMSContext context;

@Resource(mappedName = "jms/inboundQueue")
private Queue inboundQueue;

public void sendMessageNew(String payload) {
 context.send(inboundQueue, payload);
}  

Die Beispiele sind der Sektion 11.4 des JMS 2.0 Early Draft Papiers entnommen, die noch weitere Demos bereit hält. Insgesamt zeigt sich JMS 2.0 als bereits fortgeschrittene Spezifikation, die nach einigem Feinschliff sicherlich den Sprung in das für Mitte 2013 erwartete Java EE 7 schaffen wird.

Selbstverständlich ist dies freilich nicht, handelt es sich bei dem Java-EE-7-Release doch um eine „Datums-getriebene“ Veröffentlichung, wie jüngst Oracles Dennis Leung auf der JAX bestätigte. Ob beispielsweise der geplante Multi-Tenancy-Support bis dahin überall fertig sein wird, steht noch in den Sternen.

In einem früheren Posting hatte Gupta bereits die Komponenten von Java EE 7 folgendermaßen beschrieben:

  • The main theme is to easily run applications on private or public clouds
  • The platform will define application metadata descriptor to describe PaaS execution environment such as multi-tenancy, resources sharing, quality-of-service, and dependencies between applications
  • Embrace latest standards like HTML5, WebSocket, JSON and have a standards-based API for each one of them
  • Remove inconsistencies between Managed Beans, EJB, Servlets, JSF, CDI, and JAX-RS
  • Possible inclusion of JAX-RS 2.0 in the Web Profile, revised JMS 2.0 API
  • Technology Refresh for several existing technologies […] and possible inclusion of Concurrency Utilities for Java EE (JSR 236) and JCache (JSR 107)

Nachverfolgen kann man die Entwicklungen an Java EE 7 im JSR 342: JavaTM Platform, Enterprise Edition 7 (Java EE 7) Specification und auf der Projektseite http://java.net/projects/javaee-spec/pages/Home.

Geschrieben von
Hartmut Schlosser
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.