3.1.7.1.3 Updating the UserMessage Packet

If the UserMessage Packet ([MS-MQMQ] section 2.2.20) contains a TransactionHeader ([MS-MQMQ] section 2.2.20.5) and the UserMessage.UserHeader.SourceQueueManager field is equal to QueueManager.Identifier and iPosition.Transmitted is FALSE, the following steps MUST be performed:

  • The UserMessage.TransactionHeader.TxSequenceID field MUST be set to the OutgoingTxSequenceID ADM element.

  • The UserMessage.TransactionHeader.PreviousTxSequenceNumber field MUST be set to the OutgoingTxSequenceNumber ADM element - 1.

  • The UserMessage.TransactionHeader.TxSequenceNumber field MUST be set to the OutgoingTxSequenceNumber ADM element.

  • iPosition.TxSequenceNumber MUST be set to the OutgoingTxSequenceNumber ADM element.

  • A new SEQUENCE_INFO ([MS-MQMQ] section 2.2.5) structure instance MUST be created and inserted into TxOutgoingSequence.UnackedSequence. The SEQUENCE_INFO structure MUST be created and set as specified in section 3.1.1.5.

  • The OutgoingTxSequenceNumber ADM element value MUST be incremented by 1.

  • The Transactional Ack Wait Timer (section 3.1.2.6) MUST be started.

If the UserMessage Packet contains a TransactionHeader and iPosition.Transmitted is TRUE, the TransactionHeader.PreviousTxSequenceNumber field MUST be set to the TxSequenceNumber ADM element of the previous transactional message in the OutgoingMessageTable ADM element. This action is necessary to bridge gaps left by transactional messages that were removed from the table (for example, TimeToReachQueue expired) since the message was first sent.

The value of the MessageSentCount ADM element MUST be incremented by 1.

iPosition.SequenceNumber MUST be set to the MessageSentCount ADM element.

If the UserMessage.UserHeader.Flags.DM field is set to 0x1, the value of the RecoverableMessageSentCount ADM element MUST be incremented by 1, and iPosition.RecoverableSequenceNumber MUST be set to the RecoverableMessageSentCount ADM element.

The value of the UnAckedMessageCount ADM element MUST be incremented by 1.

If the UserMessage Packet contains a SessionHeader ([MS-MQMQ] section 2.2.20.4), the following fields MUST be set:

  • The SessionHeader.AckSequenceNumber field MUST be set to the MessageReceivedCount ADM element.

  • The SessionHeader.RecoverableMsgAckSeqNumber field MUST be set to the lowest unacknowledged recoverable message sequence number that has been persisted for reliable recovery.

  • The SessionHeader.UserMsgSequenceNumber field MUST be set to the MessageSentCount ADM element.

  • The SessionHeader.RecoverableMsgSeqNumber field MUST be set to the RecoverableMessageSentCount ADM element.

  • The SessionHeader.RecoverableMsgAckFlags field MUST be set to the RecoverableMsgAckFlags ADM element. Subsequently, the RecoverableMsgAckFlags ADM element MUST be set to 0x00000000.

  • The SessionHeader.WindowSize field MUST be set to the WindowSize ADM element.

If the UserMessage Packet contains a SessionHeader, the protocol MUST perform the following actions:

  • The UnackedReceivedMsgCount ADM element MUST be set to 0x0000.

  • The LastAckedRecoverableMsgSeqNumber ADM element MUST be set to the RecoverableMessageReceivedCount ADM element.

iPosition.AwaitingAck MUST be set to TRUE.

The protocol MUST start the Session Ack Wait Timer (section 3.1.2.4) if it is in the stopped state.

The value of the SessionActive ADM element MUST be set to TRUE.