Class NarayanaTransactionHelper

  • All Implemented Interfaces:
    org.jboss.narayana.jta.jms.TransactionHelper

    public class NarayanaTransactionHelper
    extends org.jboss.narayana.jta.jms.TransactionHelperImpl
    • Constructor Detail

      • NarayanaTransactionHelper

        public NarayanaTransactionHelper​(javax.transaction.TransactionManager transactionManager)
    • Method Detail

      • isTransactionAvailable

        public boolean isTransactionAvailable()
                                       throws javax.jms.JMSException
        Connections were not always closed, because the super implementation of this method returns false too often. ConnectionProxy.close() and SessionProxy.close() both call this method before attempting to close the connection. When the connection is marked as STATUS_ROLLEDBACK this method will return true, claiming it's available. This scenario happened when a JMSMessage was marked for rollback by the ReaperThread while being detected as 'stuck' because of a (too) short timeout. While, even though the timeout was too short, no other unexpected behavior was detected. This mechanism however, will prevent the connection from being closed, causing a connection-leak to occur.

        NOTE: This problem is caused because in the TransactionImple.getStatus() the internal connection status is converted to a javax.transaction.Status. Because of the conversion the actual state is lost, and ActionStatus.ABORTED connections are marked as STATUS_ROLLEDBACK.

        Specified by:
        isTransactionAvailable in interface org.jboss.narayana.jta.jms.TransactionHelper
        Overrides:
        isTransactionAvailable in class org.jboss.narayana.jta.jms.TransactionHelperImpl
        Throws:
        javax.jms.JMSException