FIX: MQSeries discards MSMQ transactional messages (312137)



The information in this article applies to:

  • Microsoft Host Integration Server 2000
  • MSMQ - MQSeries Bridge

This article was previously published under Q312137

SYMPTOMS

Transactional messages may be discarded by MQSeries if the Time-To-Be Received (TTBR) or Time-To-Reach-Queue (TTRQ) property is set by the sending application.

CAUSE

When you send a transactional message from MSMQ and enable the dead-letter queue, if the message expires, it is put in the Xact dead-letter queue. The message expiration may be a result of the TTRQ expiring for the following reasons:
  • The acknowledgement from the target computer did not reach the sending computer.
  • The message did not reach the target computer.
The message expiration may also be the result of TTBR expiring for the following reasons:
  • The message was not received from the queue on the target computer.
  • The message was received, but the acknowledgement indicating that it was processed did not reach the sending computer.
When transactional messages with values in TTRQ/TTBR go through the MSMQ-MQSeries Bridge, the MSMQ-MQSeries Bridge sets this timeout in the MQSeries message header. On MQSeries, an expired message must meet several tests in order to be placed in a dead-letter queue. On MQSeries, the dead-letter queue name is designated by the application. Because the MSMQ-MQSeries Bridge has no way to determine the name for any specific queue, MQSeries detects the expiration of the message and then discards it because no dead-letter queue is specified.

RESOLUTION

A supported fix is now available from Microsoft, but it is only intended to correct the problem that is described in this article. Apply it only to computers that are experiencing this specific problem. This fix may receive additional testing. Therefore, if you are not severely affected by this problem, Microsoft recommends that you wait for the next service pack that contains this hotfix.

To resolve this problem immediately, contact Microsoft Product Support Services to obtain the fix. For a complete list of Microsoft Product Support Services phone numbers and information about support costs, visit the following Microsoft Web site:NOTE: In special cases, charges that are ordinarily incurred for support calls may be canceled if a Microsoft Support Professional determines that a specific update will resolve your problem. The typical support costs will apply to additional support questions and issues that do not qualify for the specific update in question.

The English version of this fix should have the following file attributes or later:

For the MSMQ-MQSeries Bridge distributed with SNA Server Service Pack 4 (SP4):
Date         Time    Version     Size      File name
----------------------------------------------------
6-NOV-2001   10:17   4.0.0.603   787,216   Q2qgw.exe
				
For the MSMQ-MQSeries Bridge distributed with the Host Integration Server (HIS) 2000:
Date          Time   Version      Size    File name
--------------------------------------------------
12-DEC-2001   2:10   5.64.0.836   333KB   Explres.dll
12-DEC-2001   2:14   5.64.0.836   801KB   Q2qexpl.exe
12-DEC-2001   2:14   5.64.0.836   869KB   Q2qgw.exe
12-DEC-2001   2:14   5.64.0.836    33KB   Q2qmsg.dll
12-DEC-2001   2:14   5.64.0.836   341KB   Q2qprfdl.dll
12-DEC-2001   2:14   5.64.0.836   321KB   Q2qshdll.dll
12-DEC-2001   2:10   5.64.0.836    41KB   Shdllres.dll
				
This fix adds a registry entry so that the MSMQ-MQSeries Bridge does not carry timeout values from TTBR and TTRQ into the MQSeries message header. Instead, it sets the MQSeries message header value for Expiry to UNLIMITED so that the message will not expire and be discarded by MQSeries.

Warning Serious problems might occur if you modify the registry incorrectly by using Registry Editor or by using another method. These problems might require that you reinstall your operating system. Microsoft cannot guarantee that these problems can be solved. Modify the registry at your own risk. After applying the fix, do the following:
  1. To turn on the translation feature, add the following registry key and make its value nonzero:

    Location: HKLM\Software\Microsoft\MQBridge\Server
       Value: AlwaysInfiniteToMQS (REG_DWORD)=1
    						

  2. Restart the MSMQ-MQSeries Bridge service.

STATUS

Microsoft has confirmed that this is a problem in the Microsoft products that are listed at the beginning of this article.

MORE INFORMATION

There is an alternate workaround but it requires using the MSMQ Extension property and setting several MQSeries message header values. Using the MSMQ Extension property overrides whatever values the bridge would normally put into the MQSeries message header.

To obtain the same dead-letter behavior for transactional messages on MQSeries, you must set MQMD.REPORT to send a report message back to some queue. You need to put the MQRO_EXCEPTION_WITH_FULL_DATA option into MQMD.REPORT to have the original message body returned with the negative acknowledgement. You also need to set MQMD.REPLYTOQMGR and MQMD.REPLYTOQ to designate where the report message should go. Unless you do all of these things, the message is simply discarded and data is lost.

Modification Type:MinorLast Reviewed:10/7/2005
Keywords:kbbug kbfix kbQFE KB312137