[
https://issues.apache.org/activemq/browse/AMQ-2812?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=60503#action_60503
]
Rob Davies commented on AMQ-2812:
---------------------------------
Unfortunately the JMS API says this: Invoking any other Session method on a
closed session must throw a JMSException.IllegalStateException. Closing a
closed session must not throw an exception - see
http://download.oracle.com/docs/cd/E17477_01/javaee/1.4/api/javax/jms/Session.html#close()
Looks like this is a bug in Spring ...
> ActiveMqSession should throw JMSException instead of IllegalStateException if
> connection is closed
> --------------------------------------------------------------------------------------------------
>
> Key: AMQ-2812
> URL: https://issues.apache.org/activemq/browse/AMQ-2812
> Project: ActiveMQ
> Issue Type: Bug
> Affects Versions: 5.3.2
> Environment: Spring 2.5.6
> Reporter: Morten Andersen-Gott
> Assignee: Rob Davies
> Priority: Critical
> Fix For: 5.4.0
>
>
> ActiveMqSession throws IllegalStateException if connection is closed. The
> ActiveMqSession.checkClosed() will throw the exception if the connection is
> lost. This is really an internal error which according to the
> javax.jms.Session.commit javadoc should result in a JMSException.
> The distinction between the two exceptions becomes important when using
> Spring and ActiveMq. When doing JMS inside a codeblock that is managed by a
> HibernateTransactionManager (or any other
> non-JmsTransactionManager/non-JtaTransactionManager)
> TransactionSynchronizationUtils will try to commit the jms session after the
> HibernateTransactionManager has committed. This is done by calling the
> JmsResourceHolder.commitAll() from
> TransactionSynchronizationManager.invokeAfterCommit().
> JmsResourceHolder.commitAll() will silently ignore IllegalStateExceptions as
> these are only supposed to happen in the case of a JTA transaction.
> If ActiveMqSession.commit -> ActiveMqSession.checkClosed() were to throw a
> JMSException it would propagate out of the TransactionSynchronizationUtils
> and at least the application would be made aware that the JMSSession was not
> committed.
> Below is the description of IllegalStateException from the JMS Specification:
> IllegalStateException: This exception is thrown when a method is invoked a
> an illegal or inappropriate time or if the provider is not in an appropriate
> state for the requested operation. For example, this exception must be
> thrown if Session.commit() is called on a non-transacted session. This
> exception is also must be called when domain inappropriate method is
> called, such as calling TopicSession.CreateQueueBrowser().
> While it does not specifically state that a closed connection should _NOT_
> throw an IllegalStateException, it would seem that throwing a JMSException is
> a better choice. Especially when IllegalStateException causes problems when
> using Spring.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.