You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Jiang Fuqiang (JIRA)" <ji...@apache.org> on 2014/07/08 05:20:33 UTC

[jira] [Created] (AMQ-5263) Method ActiveMQSession.close() is not thread safe as declared and required

Jiang Fuqiang created AMQ-5263:
----------------------------------

             Summary: Method ActiveMQSession.close() is not thread safe as declared and required
                 Key: AMQ-5263
                 URL: https://issues.apache.org/jira/browse/AMQ-5263
             Project: ActiveMQ
          Issue Type: Bug
          Components: JMS client
    Affects Versions: 5.9.1
         Environment: any operationg system, and platform
            Reporter: Jiang Fuqiang


If ActiveMQSession.close()  and  ActiveMQSession.dispose() run concurrently,  the statements in close() method might throw NullPointerException。Just marked by the following code snippet.
-------------------------------
    public void ActiveMQSession.close() throws JMSException {
        if (!closed) {
            if (getTransactionContext().isInXATransaction()) { // it might throw NullPointerException
			...
-------------------------------
In my application, I call Session.close() when I detect JMSException, but Session.close() throws NullPointerException at one time。
I suspect that's because ActiveMQConnection called ActiveMQSession.dispose() in case of transport error, and  ActiveMQSession.dispose() nullified ActiveMQSession.transactionContext before ActiveMQSession.closed is assigned to false.
Since this NullPointerException error just happened once and can not be reproduced, it's only a suspection. 

It seems that close() and dispose() should be synchronized, and then session can be closed safely.

I'm not good at English, but I hopes the issue is demonstrated clearly enough.



--
This message was sent by Atlassian JIRA
(v6.2#6252)