jsr343-experts@jms-spec.java.net

[jsr343-experts] (JMS_SPEC-52) Clarify that a message may be sent using a different session from that used to create the message

From: Nigel Deakin <nigel.deakin_at_oracle.com>
Date: Wed, 21 Sep 2011 12:45:32 +0100

I have raised this JIRA issue:
http://java.net/jira/browse/JMS_SPEC-52

You may remember discussing this some time ago. I was surprised to discover that we had interpreted the spec
differently, and there seemed to be general consensus that the spec should be clarified as described below.

This change also makes it easier to define standard annotations for injecting message objects, since there would no
longer be any need to worry about which session was used to create an injected message.

Comments, please..


Here is the description in JIRA
-------------------------------

The JMS 1.1 API defines how a JMS message object is created using one of the following methods on a Session:

Message createMessage()
BytesMessage createBytesMessage()
MapMessage createMapMessage()
ObjectMessage createObjectMessage()
ObjectMessage createObjectMessage(java.io.Serializable object)
StreamMessage createStreamMessage()
TextMessage createTextMessage()
TextMessage createTextMessage(java.lang.String text)

The following question has been raised:

Can a message be sent using a MessageProducer that was created from a different Session than was used to create the message?

This is not stated explicitly in the specification, and discussions within the JSR 343 Expert group show that different
individuals have come to different conclusions on this issue.

My own interpretation is that a MessageProducer must be able to send a javax.JMS.Message irrespective of how it was
created. It might have been created using Session.createMessage(), or it may have been received by a MessageConsumer.

Furthermore, Section 3.12 of the JMS 1.1 specification states explicitly that a MessageProducer must be able to send a
message that was created using a different JMS provider, and which would therefore have used a different session:

"A provider must be prepared to accept, from a client, a message whose implementation is not one of its own. A message
with a 'foreign' implementation may not be handled as efficiently as a provider's own implementation; however, it must
be handled."

Despite this, there is a widespread view within the JMS community that for messages created within the same JVM by the
same JMS provider, the session used to create the message must be the same as that used to send it.

It is therefore proposed that the JMS specification be clarified that there is no such restriction, and that a
MessageProducer can be used to send any message object

* irrespective of which session was used to create it,
* irrespective of whether the message was created within this JVM or received from a JMS destination, and
* irrespective of whether the MessageProducer and message are implemented by the same or different JMS providers.