3.1.5.8.6 Transactional Message Processing

If the UserMessage Packet ([MS-MQMQ] section 2.2.20) contains a TransactionHeader ([MS-MQMQ] section 2.2.20.5) and the value of the UserMesage.UserHeader.QueueManagerAddress field is equal to QueueManager.Identifier, the following logic must be applied:

The receiver MUST schedule sending an OrderAck Packet (section 2.2.4) based on the state of the Order Ack Send Timer (section 3.1.2.7) and the values of the LastOrderAckSendTime ADM element and the MaximumOrderAckDelay ADM element. If the timer is active and the time elapsed from the LastOrderAckSendTime ADM element is less than the MaximumOrderAckDelay ADM element, the timer MUST be restarted with the duration set to the OrderAckTimeout ADM element. If the timer is inactive, it MUST be started with the duration set to the OrderAckTimeout ADM element. When the timer expires, an OrderAck Packet MUST be sent as specified in section 3.1.6.9.

Transactional messages are accepted only in order and exactly once. The following conditions define when a message is accepted. A transactional message is accepted if any of the following conditions is true:

  • The UserMessage.TransactionHeader.TxSequenceID field is equal to the IncomingTxSequenceID ADM element and the UserMessage.TransactionHeader.TxSequenceNumber field is greater than the IncomingTxSequenceNumber ADM element and the UserMessage.TransactionHeader.PreviousTxSequenceNumber field is less than or equal to the IncomingTxSequenceNumber ADM element.

  • The UserMessage.TransactionHeader.TxSequenceID field is greater than the IncomingTxSequenceID ADM element and the UserMessage.TransactionHeader.PreviousTxSequenceNumber field is equal to 0x00000000.

If the message is not accepted, the TxMessageRejectCount ADM element MUST be incremented by 1. The IncomingTransactionalTransferInfo.RejectCount ADM attribute MUST be set to the TxMessageRejectCount ADM element. If the packet is accepted, the TxMessageRejectCount ADM element MUST be set to zero.

The IncomingTransactionalTransferInfo.LastAccessTime ADM attribute MUST be set to the current system time.

The protocol MUST set the IncomingTxSequenceID ADM element to the UserMessage.TransactionHeader.TxSequenceID field and MUST set the IncomingTxSequenceNumber ADM element to the UserMessage.TransactionHeader.TxSequenceNumber field.