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

Crashing and restarting the broker causes message redelivery even if the XA transaction was already prepared (but not commited)

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 5.3.1
    • 5.6.0, 5.x
    • None
    • None

    Description

      The scenario is as follows:
      - message is delivered within an XA global transaction
      - the XA tx completes the prepare phase
      - the server crashes before the XA tx completes the commit
      - the server is restarted
      - (if the J2EE server supports XA recovery, it will recover the XA tx and complete the commit (tested and confirmed with Websphere))
      - ActiveMQ redelivers the message

      The redelivery should not happen. Unless, following recovery, the TransactionManager decides to rollback the tx, the tx will be committed. If it is committed, the message would have been processed already. Redelivering it causes the message to be processed again and breaks JMS' deliver-once-and-only-once guarantee.

      If the tx has been prepared, AMQ should not redeliver the message following a crash recovery, If the tx is ultimately rolled back and the message is put back on the queue, it can redeliver it, otherwise, it should not.

      This is very difficult to write a Junit test for but I will try to come up with something...

      Attachments

        1. XATransactionRecoveryTest.java
          5 kB
          Eugene Rodos

        Issue Links

          Activity

            People

              gtully Gary Tully
              rodos77 Eugene Rodos
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: