Uploaded image for project: 'ActiveMQ Classic'
  1. ActiveMQ Classic
  2. AMQ-5263

Method ActiveMQSession.close() is not thread safe as declared and required

Attach filesAttach ScreenshotAdd voteVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 5.9.1
    • None
    • JMS client
    • None
    • any operationg system, and any platform

    Description

      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.

      Attachments

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            Unassigned Unassigned
            jiangfuqiang Jiang Fuqiang

            Dates

              Created:
              Updated:

              Slack

                Issue deployment