Article ID: 174387 - Last Review: August 11, 2006 - Revision: 5.1 INFO: Using a Single MSMQ Queue for an MTS Component
This article was previously published under Q174387 On This PageSUMMARY
Microsoft Message Queue Server (MSMQ) send and receive operations can be
included in Microsoft Transaction Server (MTS) transactions. Since an MTS
component can be marked for transactions in several ways, you may need to
manage two types of queues and write conditional code to avoid queue and
component type mismatch (MQ_ERROR_TRANSACTION_USAGE error). It is possible
to use a single transactional queue in all the cases. MTS provides the
context object, IsInTransaction() method, to determine whether or not the
component is transactional. MSMQ provides specific flags in send and
receive APIs and ActiveX calls to deal with specific cases.
MORE INFORMATION
The following table shows the results of using MQ_MTS_TRANSACTION constant
in the pTransaction parameter of send/receive APIs and ActiveX methods for
different combinations of components and queue types.
T= Transactional , N= Non-transactional MQ_MTS_TRANSACTION in MQSendMessage/ Send: Component Queue Result -------- --------- --------- T T OK T N Error N N OK N T Error MQ_MTS_TRANSACTION in MQReceiveMessage/ Receive: Component Queue Result --------- --------- --------- T T OK T N Error N N OK N T OK, * *(assume local queue) How to Use a Single Transactional Queue with MQSendMessage/SendIf the component is non-transactional, use the MQ_SINGLE_MESSAGE constant in the pTransaction parameter of MQSendMessage/Send call to send to a transactional queue. This makes the message transactional. This is an independent transaction not related to the MTS transaction and will not rollback the send operation if the MTS component is marked transactional and you call SetAbort to end the MTS transaction.How to Use a Single Transactional Queue with MQReceiveMessage/ReceiveUse MQ_NO_TRANSACTION constant in the pTransaction parameter of MQReceiveMessage/Receive call. This makes it possible to receive non- transactional from the transactional queue even if the queue is not local.You will need to use the MTS context object, IsInTransaction() method, to determine whether or not the component is transactional and then pass the appropriate flag to the MSMQ send/receive call. For code example using MSMQ C API and ActiveX see the articles in the "References" section. REFERENCES
For additional information, please see the following articles in the
Microsoft Knowledge Base:
176816
(http://support.microsoft.com/kb/176816/EN-US/
)
HOWTO: Using MSMQ within an MTS Component in Java
| Other Resources Other Support Sites
CommunityArticle Translations |






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email
Back to the top