2.2.5 FinalAck Packet

The FinalAck Packet contains a stand-alone transactional acknowledgment message that is sent to the original sender in one of two situations: either when a transactional message is rejected by the receiver; or when an accepted transactional message with a UserHeader.Flags.JN or a UserHeader.Flags.JP field set to 0x1 is removed from the destination queue.

The packet can represent a positive or negative acknowledgment. The MessageClass field of the contained MessagePropertiesHeader ([MS-MQMQ] section 2.2.19.3) packet defines the type of acknowledgment. The FinalAck Packet is an end-to-end acknowledgment.


0


1


2


3


4


5


6


7


8


9

1
0


1


2


3


4


5


6


7


8


9

2
0


1


2


3


4


5


6


7


8


9

3
0


1

BaseHeader (16 bytes)

...

...

UserHeader (variable)

...

MessagePropertiesHeader (variable)

...

BaseHeader (16 bytes): A BaseHeader ([MS-MQMQ] section 2.2.19.1). The BaseHeader.Flags field MUST have all bits set to 0.

UserHeader (variable): A UserHeader ([MS-MQMQ] section 2.2.19.2). The Flags.MP flag MUST be set to 0x1 to indicate that a MessagePropertiesHeader is included. The Flags.DM flag MUST be set to 0x1 to request recoverable messaging. All other bits MUST be set to 0 except Flags.DQ, which MUST be set either to 0x3 or to 0x7. If Flags.DQ is 0x3, the DestinationQueue field MUST be a PrivateQueueFormatNameId ([MS-MQMQ] section 2.2.18.1.5.1) with PrivateQueueIdentifier set to 0x00000004. If Flags.DQ is 0x7, the DestinationQueue field MUST be a DirectQueueFormatName ([MS-MQMQ] section 2.2.18.1.5.2) with DirectFormatName set to a string in the format specified by the following ABNF rules.

 orderQueueName = ("TCP:" ip-address / "SPX:" ipx-address ) 
                   "\PRIVATE$\order_queue$"
 ip-address=(IPv6address / IPv4address)
 ipx-address= 8HEXDIG "." 12HEXDIG ; network.node
 HEXDIG = Digit | "A" | "B" | "C" | "D" | "E" | "F"
 Digit = %x30-39

The use of TCP or SPX depends on whether TCP or SPX transport is supported.<18> The value for IPv4address [RFC3986], IPv6address [RFC3986], or ipx-address MUST represent the IP or IPX address of the queue manager to receive the message.

MessagePropertiesHeader (variable): A MessagePropertiesHeader. The Label field MUST be set to "QM Ordering Ack". The MessageSize field MUST be set to 0x00000024. The Flags field MUST have all bits set to 0.

For a positive acknowledgment, the MessageClass field MUST be set to MQMSG_CLASS_ACK_RECEIVE. For a negative acknowledgment, the MessageClass field MUST be set to one of the following message class identifiers:

  • MQMSG_CLASS_NACK_NOT_TRANSACTIONAL_Q

  • MQMSG_CLASS_NACK_BAD_DST_Q

  • MQMSG_CLASS_NACK_ACCESS_DENIED

  • MQMSG_CLASS_NACK_BAD_ENCRYPTION

  • MQMSG_CLASS_NACK_UNSUPPORTED_CRYPTO_PROVIDER

  • MQMSG_CLASS_NACK_BAD_SIGNATURE

  • MQMSG_CLASS_NACK_Q_EXCEED_QUOTA

  • MQMSG_CLASS_NACK_Q_DELETED

  • MQMSG_CLASS_NACK_Q_PURGED

  • MQMSG_CLASS_NACK_RECEIVE_TIMEOUT

For more details on message class identifiers, see [MS-MQMQ] section 2.2.18.1.6.

The BodyType field MUST be set to the value VT_EMPTY ([MS-MQMQ] section 2.2.12). The MessageBody field MUST be in the FinalAck Body (section 2.2.5.1) format.