[ 
https://issues.apache.org/jira/browse/AMQ-5263?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16611946#comment-16611946
 ] 

Krzysztof Mackowiak commented on AMQ-5263:
------------------------------------------

In my team we experienced the same issue with ActiveMQSession.close() and 
ActiveMQSession.commit() methods running concurrently. In our case the bug 
manifested not by NullPointerException, but by losing messages during failover 
between 2 instances of ActiveMQ broker.

According to ActiveMQSession documentation calling close() method in another 
thread than a thread which is handling messages should be thread-safe. This 
method is called during failover from one instance of ActiveMQ broker to 
another when the master is stopped.Unfortunately, it looks that close() method 
is NOT safe to call from another thread. When it is called from another thread 
we may end up with a situation when ActiveMQSession.commit() method ends 
without any exception but underneath ‘rollback message’ (TransactionInfo with 
type ROLLBACK) is sent to a broker. So a message is lost.

I've attached a test which simulates this situation.

> 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 any platform
>            Reporter: Jiang Fuqiang
>            Priority: Major
>
> 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 occasionally。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 sessions 
> can be closed safely.
> I'm not good at English, but I hope this issue is demonstrated clearly enough.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to