Shared Subscriptions - Multiple consumers now allowed on the same topic subscription [JMS 2.0]

In JMS 1.1, a durable or non-durable topic subscription was not permitted to have more than one consumer at a time. For improved scalability, this restriction has been removed in JMS 2.0 with the introduction of the concept of Shared Consumers. All shared consumers have a unique "Shared Subscription Name" and each message from the subscription is delivered to only one of the consumers on that subscription. These are further divided into

  • Non-durable subscriptions
  • Durable subscriptions

Sending messages asynchronously [JMS 2.0]

New send methods have been added to MessageProducer which allow messages to be sent asynchronously. These methods return immediately and perform the send operation in a separate thread without blocking the calling thread. When the send is complete, a call-back method is invoked on an object supplied by the caller.

Delivery delay [JMS 2.0]

A message's delivery time is the earliest time when a JMS provider may deliver the message to a consumer. The provider must not deliver messages before the delivery time has been reached. If a message is published to a topic, it will only be added to a durable or non-durable subscription on that topic if the subscription exists at the time the message is sent.

New methods to create a session [JMS 2.0]

Two new methods are added to javax.jms.Connection to create session.

  • createSession(int sessionMode)
    To simplify application code, this method provides the same functionality as the method createSession(boolean transacted, int acknowledgeMode) but with a single argument.
  • createSession()
    This is intended for use in a Java EE web or EJB container in the case when there is an active JTA transaction, where the sessionMode supplied to createSession(int sessionMode) is ignored.

New createDurableConsumer methods [JMS 2.0]

The javax.jms.Session interface has been extended to add two createDurableConsumer methods which return a MessageConsumer. These are intended to replace the existing createDurableSubscription methods which return a domain-specific TopicSubscriber.

Client ID optional on shared durable subscriptions [JMS 2.0]

In JMS 2.0, shared durable subscriptions will not have the restriction for the client identifier to be set when creating or activating a durable subscription.

Use of AutoCloseable [JMS 2.0]

The Connection, Session, MessageProducer, MessageConsumer and QueueBrowser interfaces have been modified to extend the java.lang.Autocloseable interface. This means that applications can create these objects using a Java SE 7 try-with-resources statement which removes the need for applications to explicitly call close() when these objects are no longer required.

JMSXDeliveryCount [JMS 2.0]

The existing message property JMSXDeliveryCount has been made mandatory. It was previously optional. This means that JMS providers must set this property when a message is delivered to the number of times the message has been delivered.

Simplified API [JMS 2.0]

Three new objects JMSContext, JMSProducer and JMSConsumer have been added which together combine the functionality of the existing Connection, Session, MessageProducer and MessageConsumer objects.

Apart from this, several other classes related to handling messaging or exceptions have been introduced, such as

  • javax.jms.CompletionListener
  • javax.jms.IllegalStateRuntimeException
  • javax.jms.InvalidClientIDRuntimeException
  • javax.jms.InvalidDestinationRuntimeException
  • javax.jms.InvalidSelectorRuntimeException
  • javax.jms.JMSRuntimeException and many more.

New method to extract the body directly from a Message [JMS 2.0]

Two new methods have been added to Message:

  • <T> getBody(Class<T> c)
  • boolean isBodyAssignableTo(Class c)

The getBody method returns the message body as an object of the specified type. This provides a convenient way to obtain the body from a newly-received Message object. The isBodyAssignableTo method is a companion method which can be used to determine whether a subsequent call to getBody would be able to return the body of a particular Message object as a particular type.

Subscription name characters and length [JMS 2.0]

JMS 1.1 did not define what characters were valid in a durable subscription name, or what length of name was supported.

JMS 2.0 defines a minimum set of characters that must be valid in a durable or non-durable subscription name. It also mandates that subscription names of up to 128 characters long must be supported.

Activation properties [JMS 2.0]

"MDB activation properties" defines a set of activation properties for use with JMS message-driven beans (Java EE Connector Architecture specification, version 1.6). A few MDB activation properties have been added and others made optional.

Native C++ Runtime Library

FioranoMQ 10 ships with a new Native C++ Client Runtime Library, with better performance and stability. It also supports a simplified JMS2.0 API.

Support for Queue/Topic Shutdown and Restart

Support has been added for Queue/Topic Shutdown or Restart. This feature is helpful in changing destination configurations at runtime and having them affected by just restarting the particular destination without the need to restart the complete FMQ Server.