To send a message using an internal transaction, call MQBeginTransaction to initiate the transaction and call MQSendMessage to send the message.
Note Each MSMQ message can have no more than 4 MB of data.
ITransaction *pTransaction;
hr = MQBeginTransaction (&pTransaction); // Pointer to a pointer
// to the transaction
// object.
hr = MQSendMessage(h, // Handle to destination queue.
&msgprops, // Pointer to MQMSGPROPS structure.
pTransaction); // Pointer to transaction object.
hr = pTransaction->Commit(0, 0, 0);
-or-
hr = pTransaction->Abort(0, 0, 0);
pTransaction->Release();
This example sends a single message within an internal transaction.
void TransactSend(QUEUEHANDLE h, MQMSGPROPS * pMsgProps)
{
HRESULT hr;
printf ("\nStarting transaction...\n\n");
///////////////////////////////////////
// Call MQBeginTransaction to initiate
// the internal transaction.
///////////////////////////////////////
ITransaction *pTransaction;
hr = MQBeginTransaction (&pTransaction); // Pointer to a
// pointer to the
// transaction object
if (FAILED(hr))
{
Error ("BeginTransaction",hr);
}
////////////////////////////////////
// Set default to commit the
// transaction.
////////////////////////////////////
BOOL fCommit = TRUE;
////////////////////////////////////
// Within the transaction: Call
// MQSendMessage to send the message to
// the Receiver Side.
//////////////////////////////////////
hr = MQSendMessage(h, // Handle to destination
// queue.
&msgprops, // Pointer to MQMSGPROPS
// structure.
pTransaction); // Pointer to transaction
// object.
if (FAILED(hr))
{
printf("\nFailed in MQSendMessage(). hresult- %lxh\n", (DWORD) hr) ;
fCommit = FALSE; // Aborting as MQSendMessage failed.
}
////////////////////////////////////
// Commit or abort the transaction.
////////////////////////////////////
if (fCommit)
{
printf ("Committing the transaction... ");
hr = pTransaction->Commit(0, 0, 0);
if (FAILED(hr))
printf ("Failed... Transaction aborted.\n\n");
else
printf ("Transaction committed successfully.\n\n");
}
else
{
printf ("Aborting the transaction... ");
hr = pTransaction->Abort(0, 0, 0);
if (FAILED(hr))
Error("Transaction Abort",hr);
else
printf ("Transaction aborted.\n\n");
}
//////////////////////////
// Release the transaction.
//////////////////////////
pTransaction->Release();
}