Links

  • 1. Sogeti
  • 2. JBoss
  • 3. IBM
  • 4. Oracle
  • 5. SpringSource
  • 6. NL-JUG
  • 7. Java

Archives

Syndication  RSS 2.0

RSS 1.0
RSS 2.0

Bookmark this site

Add 'JCN Blog' site to delicious  Add 'JCN Blog' site to technorati  Add 'JCN Blog' site to digg  Add 'JCN Blog' site to dzone

Posted by Eric Gunnewegh at 9:14 on Tuesday 20 August    Add 'JMS 2.0' site to delicious  Add 'JMS 2.0' site to technorati  Add 'JMS 2.0' site to digg  Add 'JMS 2.0' site to dzone

Inleiding

Eén van de vernieuwde API’s in JEE7 is JMS 2.0. De JMS API is lang stabiel gebleven na de release van JMS 1.1 in 2002. Sinds JavaEE 1.4 maakt JMS 1.1 onderdeel uit van het Java EE platform. Twee zaken die opvallen in de nieuwe JMS API zijn het vereenvoudigde programmeermodel en het gebruik van de nieuwe features die het Java SE platform inmiddels biedt met Java SE 7. Daarnaast zijn er aan de JMS API ook een aantal nieuwe features toegevoegd.

Vereenvoudigd programmeermodel

In figuur 1 is het klassieke JMS programmeermodel weergegeven dat bestaat sinds 2002.

 

JMS 1.1

Figuur 1: Het klassieke JMS 1.1 programmeermodel

In JMS 2.0 is dit programmeermodel vereenvoudigd met de introductie van de JMSContext, zoals weergegeven in figuur 2. De JMSContext combineert de Connection en Session objecten in één object. Daarnaast bevat de nieuwe API de nieuwe JMSConsumer en JMSProducer objecten. De klassieke API wordt overigens niet vervangen door de nieuwe API. Beide API’s blijven naast elkaar bestaan. Wat dit vereenvoudigd programmeermodel betekent voor de Java code, laat zich goed illustreren door codefragment 1.

JMS 2.0

Figuur 2: Het vereenvoudigde JMS 2.0 programmeermodel

   @Resource(lookup = “java:comp/DefaultJMSConnectionFactory”)
   private static ConnectionFactory connectionFactory;

   @Resource(lookup = “jms/TestQueue”)
   private static Queue queue;

   String message = “Een test message”;
   try (JMSContext context = connectionFactory.createContext();) {
      context.createProducer().
         setDeliveryMode(DeliveryMode.NON_PERSISTENT).
         setPriority(9).
         setTimeToLive(10000).
         send(queue, message);
   } catch (JMSRuntimeException e) {
      System.out.println(e);
   }

Codefragment 1: Het versturen van een message

Codefragment 1 laat zien hoe je met de vernieuwde JMS API op vereenvoudigde manier een bericht kunt sturen. Vergeleken met de klassieke API vallen een aantal zaken op.

  1. Een Producer creëren gaat sneller via een JMSContext dan in het oude model via achtereenvolgens een Connection en een Session.
  2. Er hoeft niet eerst een TextMessage gecreëerd te worden. De Producer accepteert ook een String.
  3. Het creëren van JMSContext gebeurt in een try-with-resources block, een nieuw feature van het Java SE7 platform. De JMSContext interface extends de AutoCloseable interface, zodat bij het afsluiten van het try-with-resources block automatisch de close() methode wordt aangeroepen.
  4. Bij het creëren van de JMSProducer kan method chaining gebruikt worden voor het zetten van de diverse opties. In JMS 2.0 hebben de diverse setters voor het zetten van opties, headers en properties de JMSProducer als return value, wat method chaining mogelijk maakt.

Ook het ontvangen van berichten is vereenvoudigd. Zie ter illustratie het volgende codevoorbeeld waarbij het niet nodig is om een Message om te zetten naar een TextMessage om hier vervolgens de body uit op te vragen.

   String msg = context.createConsumer(queue).receiveBody(String.class, 1000);

Injectie van JMSContext

In een servlet of EJB is het mogelijk om direct de JMSContext te injecteren, in plaats van deze aan te maken via een geïnjecteerde ConnectionFactory.

   @Inject
   @JMSConnectionFactory(“jms/MyConnectionFactory”)
   private JMSContext context;

Wanneer gebruik gemaakt wordt van de default ConnectionFactory, kan de @JMSConnectionFactory achterwege gelaten worden.

sessionMode

De introductie van de sessionMode biedt de ontwikkelaar een duidelijker keuze in het gebruik van een transactionele sessie of een acknowledge mode. In de klassieke JMS API bevat het Connection object de volgende methode die de ontwikkelaar op het verkeerde been kan zetten.

   Session createSession(boolean transacted, int acknowledgeMode) throws JMSException;

Het probleem met deze methode is dat niet alle combinaties valide zijn. Bij een transactionele sessie (transacted=true) vindt een acknowledgement automatisch plaats na een commit. In deze situatie heeft het geen zin om een acknowledgeMode op te geven. Andersom geldt ook dat een acknowledgeMode alleen betekenis heeft bij transacted=false.

De vernieuwde JMS API biedt meer duidelijkheid met de volgende methode in het Connection object

   Session createSession(int sessionMode) throws JMSException;

of de volgende methode in het ConnectionFactory of JMSContext object.

   JMSContext createContext(int sessionMode);

De sessionMode kan één van de volgende waarden hebben, waardoor de ontwikkelaar moet kiezen tussen een transactionele sessie of een acknowledgement mode.

   Session.SESSION_TRANSACTED
   Session.CLIENT_ACKNOWLEDGE
   Session.AUTO_ACKNOWLEDGE
   Session.DUPS_OK_ACKNOWLEDGE
   Session.TRANSACTED

Hoewel dit een stuk duidelijker is dan in de klassieke JMS API, geldt ook hier dat niet elke waarde in alle situaties geldig is. Bijvoorbeeld, als de methode wordt aangeroepen in een Web of EJB container in een actieve transactionele JTA context, wordt de sessionMode genegeerd. Voor de details wordt verwezen naar de Javadoc, die met betrekking tot dit onderwerp in JMS 2.0 ook een stuk uitgebreider is geworden, zie http://docs.oracle.com/javaee/7/api/javax/jms/Connection.html#createSession(int).

Shared subsriptions

Eén van de nieuwe features in de JMS 2.0 API zijn de shared subscriptions op topics. Voor wat betreft topics waren er voorheen twee varianten, durable en non-durable topics, die beiden alleen unshared subscriptions ondersteunden. In JMS 2.0 kunnen subscriptions ook shared zijn.

In de JMS 1.1 API konden meerdere consumers een eigen subscription hebben op hetzelfde topic. Elke consumer met een eigen subscription (unshared subscription) ontving dan elk bericht dat op het topic gepubliceerd werd. Pas in JMS 2.0 is het mogelijk dat meerdere consumers een subscription kunnen delen (shared subscription). De berichten die op een topic met een shared subscription gepubliceerd worden, worden door de JMS provider verdeeld over de consumers die bij de shared subscription horen, waarmee het mogelijk wordt berichten parallel af te handelen in meerdere threads.

Exception handling

In de JMS 2.0 API wordt de unchecked JMSRuntimeException gebruikt in plaats van de checked JMSException, zie bijvoorbeeld ook codefragment 1. Dit betekent dat de aanroeper van de methodes in de JMS 2.0 API niet verplicht is deze Exception af te vangen.

Zie ter illustratie ook de createTextMessage() methode in respectievelijk de objecten Session en JMSContext.

   //klassieke API
   TextMessage createTextMessage() throws JMSException;

   //JMS 2.0
   TextMessage createTextMessage();

Wat ook een verbetering is in de JMS 2.0 API is dat de JMSRuntimeException nu ook een constructor heeft met een Throwable als argument. Bij de klassieke JMSExcepion ontbrak een dergelijke contstructor. In plaats daarvan heeft de JMSExcepion een linkedException, die in de praktijk vaak over het hoofd wordt gezien.

Aan de slag met JMS 2.0

Voor wie zelf wil ontdekken wat JMS 2.0 nog meer te bieden heeft, kan snel aan de slag met GlassFish en de JEE 7 SDK. De downloads bevatten diverse examples. Wie gebruik maakt van de built-in JMS Provider van GlassFish, is QBrowser een handige tool voor het bekijken van queues, topics en berichten.

http://www.oracle.com/technetwork/java/javaee/downloads/index.html
http://sourceforge.net/projects/qbrowserv2/
http://docs.oracle.com/javaee/7/tutorial/doc/partmessaging.htm#GFIRP3
https://jms-spec.java.net/2.0/apidocs/

Posted by Eric Gunnewegh at 7:33 on Monday 30 October    Add 'IBM WebSphere Developer Technical Journal: Running a standalone Java application on WebSphere MQ V6.0' site to delicious  Add 'IBM WebSphere Developer Technical Journal: Running a standalone Java application on WebSphere MQ V6.0' site to technorati  Add 'IBM WebSphere Developer Technical Journal: Running a standalone Java application on WebSphere MQ V6.0' site to digg  Add 'IBM WebSphere Developer Technical Journal: Running a standalone Java application on WebSphere MQ V6.0' site to dzone

The article Developing a standalone Java application for WebSphere MQ showed how to use IBM WebSphere MQ V5.3 as a Java™ Messaging Service (JMS) and Java Naming and Directory Interface (JNDI) provider for a Java 2 Standard Edition (J2SE) application (more specifically, for an application that is not running in a Java 2 Enterprise Edition (J2EE) application server).

This article revisits that same topic, but this time with attention to WebSphere MQ V6.0, which now includes as part of the base product the JMS classes needed to create JMS applications, as well as the innate ability to act as a publish/subscribe broker that implements JMS topics. The result is a platform for which it is simpler to develop applications, as well as quicker to deploy to, and easier to manage.

Posted by Ruud Steeghs at 19:42 on Monday 26 June    Add 'Keep JMS simple with Spring and MantaRay' site to delicious  Add 'Keep JMS simple with Spring and MantaRay' site to technorati  Add 'Keep JMS simple with Spring and MantaRay' site to digg  Add 'Keep JMS simple with Spring and MantaRay' site to dzone

Create a simple, distributed application framework
Java Platform, Enterprise Edition is complex and cumbersome. Using lightweight frameworks is a new trend, as illustrated by the popularity of Spring, a lightweight application framework. This article describes how to integrate Spring with MantaRay, a lightweight messaging solution, to create a distributed, easy-to-use-and-deploy application framework.

Posted by Hans-Jürgen Jacobs at 21:47 on Thursday 23 February    Add 'Asynchronous Messaging Made Easy With Spring' site to delicious  Add 'Asynchronous Messaging Made Easy With Spring' site to technorati  Add 'Asynchronous Messaging Made Easy With Spring' site to digg  Add 'Asynchronous Messaging Made Easy With Spring' site to dzone

Asynchronous process communication is an important part of a service-oriented architecture (SOA), since many system communications in an enterprise, especially those with external organizations, are asynchronous in nature. Java Message Service (JMS) is the API used to write JEE applications using asynchronous messaging. A traditional messaging implementation using the JMS API involves steps like JNDI lookups for the queue connection factory and Queue resources and creating a JMS session before actually sending or receiving a message. [onjava.com]

Posted by Hans-Jürgen Jacobs at 10:13 on Wednesday 7 December    Add 'Spring’s JmsTemplate gotchas and recommendations' site to delicious  Add 'Spring’s JmsTemplate gotchas and recommendations' site to technorati  Add 'Spring’s JmsTemplate gotchas and recommendations' site to digg  Add 'Spring’s JmsTemplate gotchas and recommendations' site to dzone

In "Spring’s JmsTemplate gotchas and recommendations," James Strachan points out some potential problems with how people can use Spring’s JmsTemplate – namely, by not understanding how it might create a connection, a session, and a producer or consumer on every call. [James Strachan's weblog]

Posted by Hans-Jürgen Jacobs at 14:12 on Friday 14 October    Add '1-2-3 messaging with Spring JMS' site to delicious  Add '1-2-3 messaging with Spring JMS' site to technorati  Add '1-2-3 messaging with Spring JMS' site to digg  Add '1-2-3 messaging with Spring JMS' site to dzone

Quick-step through the basics of JMS messaging, with the Spring JMS framework and IBM WebSphere MQ 5.3. [developerworks]

Posted by Hans-Jürgen Jacobs at 14:52 on Friday 10 December    Add 'Distributed Enterprise Messaging with MantaRay' site to delicious  Add 'Distributed Enterprise Messaging with MantaRay' site to technorati  Add 'Distributed Enterprise Messaging with MantaRay' site to digg  Add 'Distributed Enterprise Messaging with MantaRay' site to dzone

Java Messaging Service (JMS) is a much-used system for distributed enterprise applications, but many implementations use a “broker” approach that creates bottlenecks. MantaRay implements the JMS API through a peer-to-peer approach that, as Amir Shevat reports, provides some significant advantages. [onjava.com]

Posted by Hans-Jürgen Jacobs at 12:31 on Wednesday 24 November    Add 'Getting Started with Java Message Service (JMS)' site to delicious  Add 'Getting Started with Java Message Service (JMS)' site to technorati  Add 'Getting Started with Java Message Service (JMS)' site to digg  Add 'Getting Started with Java Message Service (JMS)' site to dzone

The Java Message Service (JMS) is designed to allow Java applications to use enterprise messaging systems. It makes it easy to develop enterprise applications that asynchronously send and receive business data and events. Learn how to implement it for your business. [java.sun.com]


© 2020 Java Competence Network. All Rights Reserved.