MessageQueue.ReceiveByCorrelationId Method
Receives a message that matches a given correlation identifier.
Overload List
Receives the message that matches the given correlation identifier, from a nontransactional queue, and immediately raises an exception if no message with the specified correlation identifier currently exists in the queue.
[Visual Basic] Overloads Public Function ReceiveByCorrelationId(String) As Message
[C#] public Message ReceiveByCorrelationId(string);
[C++] public: Message* ReceiveByCorrelationId(String*);
[JScript] public function ReceiveByCorrelationId(String) : Message;
Receives the message that matches the given correlation identifier, from a transactional queue, and immediately raises an exception if no message with the specified correlation identifier currently exists in the queue.
[Visual Basic] Overloads Public Function ReceiveByCorrelationId(String, MessageQueueTransaction) As Message
[C#] public Message ReceiveByCorrelationId(string, MessageQueueTransaction);
[C++] public: Message* ReceiveByCorrelationId(String*, MessageQueueTransaction*);
[JScript] public function ReceiveByCorrelationId(String, MessageQueueTransaction) : Message;
Receives the message that matches the given correlation identifier, and immediately raises an exception if no message with the specified correlation identifier currently exists in the queue.
[Visual Basic] Overloads Public Function ReceiveByCorrelationId(String, MessageQueueTransactionType) As Message
[C#] public Message ReceiveByCorrelationId(string, MessageQueueTransactionType);
[C++] public: Message* ReceiveByCorrelationId(String*, MessageQueueTransactionType);
[JScript] public function ReceiveByCorrelationId(String, MessageQueueTransactionType) : Message;
Receives the message that matches the given correlation identifier, from a nontransactional queue, and waits until either a message with the specified correlation identifier is available in the queue, or the time-out expires.
[Visual Basic] Overloads Public Function ReceiveByCorrelationId(String, TimeSpan) As Message
[C#] public Message ReceiveByCorrelationId(string, TimeSpan);
[C++] public: Message* ReceiveByCorrelationId(String*, TimeSpan);
[JScript] public function ReceiveByCorrelationId(String, TimeSpan) : Message;
Receives the message that matches the given correlation identifier, from a transactional queue, and waits until either a message with the specified correlation identifier is available in the queue, or the time-out expires.
[Visual Basic] Overloads Public Function ReceiveByCorrelationId(String, TimeSpan, MessageQueueTransaction) As Message
[C#] public Message ReceiveByCorrelationId(string, TimeSpan, MessageQueueTransaction);
[C++] public: Message* ReceiveByCorrelationId(String*, TimeSpan, MessageQueueTransaction*);
[JScript] public function ReceiveByCorrelationId(String, TimeSpan, MessageQueueTransaction) : Message;
Receives the message that matches the given correlation identifier, and waits until either a message with the specified correlation identifier is available in the queue, or the time-out expires.
[Visual Basic] Overloads Public Function ReceiveByCorrelationId(String, TimeSpan, MessageQueueTransactionType) As Message
[C#] public Message ReceiveByCorrelationId(string, TimeSpan, MessageQueueTransactionType);
[C++] public: Message* ReceiveByCorrelationId(String*, TimeSpan, MessageQueueTransactionType);
[JScript] public function ReceiveByCorrelationId(String, TimeSpan, MessageQueueTransactionType) : Message;
Example
[Visual Basic, C#, C++] The following example sends and receives a message containing an order to and from a queue. It specifically requests a positive acknowledgment when the original message reaches or is retrieved from the queue.
[Visual Basic, C#, C++] Note This example shows how to use one of the overloaded versions of ReceiveByCorrelationId. For other examples that might be available, see the individual overload topics.
[Visual Basic] Imports System Imports System.Messaging Namespace MyProject _ '/ <summary> '/ Provides a container class for the example. '/ </summary> Public Class MyNewQueue '************************************************** ' Provides an entry point into the application. ' ' This example sends and receives a message from ' a queue. '************************************************** Public Shared Sub Main() ' Create a new instance of the class. Dim myNewQueue As New MyNewQueue() ' Create new queues. CreateQueue(".\myQueue") CreateQueue(".\myAdministrationQueue") ' Send messages to a queue. myNewQueue.SendMessage() ' Receive messages from a queue. Dim messageId As String = myNewQueue.ReceiveMessage() ' Receive acknowledgment message. If Not (messageId Is Nothing) Then myNewQueue.ReceiveAcknowledgment(messageId, ".\myAdministrationQueue") End If Return End Sub 'Main '************************************************** ' Creates a new queue. '************************************************** Public Shared Sub CreateQueue(queuePath As String) Try If Not MessageQueue.Exists(queuePath) Then MessageQueue.Create(queuePath) Else Console.WriteLine((queuePath + " already exists.")) End If Catch e As MessageQueueException Console.WriteLine(e.Message) End Try End Sub 'CreateQueue '************************************************** ' Sends a string message to a queue. '************************************************** Public Sub SendMessage() ' Connect to a queue on the local computer. Dim myQueue As New MessageQueue(".\myQueue") ' Create a new message. Dim myMessage As New Message("Original Message") myMessage.AdministrationQueue = New MessageQueue(".\myAdministrationQueue") myMessage.AcknowledgeType = AcknowledgeTypes.PositiveReceive Or AcknowledgeTypes.PositiveArrival ' Send the Order to the queue. myQueue.Send(myMessage) Return End Sub 'SendMessage '************************************************** ' Receives a message containing an Order. '************************************************** Public Function ReceiveMessage() As String ' Connect to the a queue on the local computer. Dim myQueue As New MessageQueue(".\myQueue") myQueue.MessageReadPropertyFilter.CorrelationId = True ' Set the formatter to indicate body contains an Order. myQueue.Formatter = New XmlMessageFormatter(New Type() {GetType(String)}) Dim returnString As String = Nothing Try ' Receive and format the message. Dim myMessage As Message = myQueue.Receive() ' Display message information. Console.WriteLine("____________________________________________") Console.WriteLine("Original message information--") Console.WriteLine(("Body: " + myMessage.Body.ToString())) Console.WriteLine(("Id: " + myMessage.Id.ToString())) Console.WriteLine("____________________________________________") returnString = myMessage.Id Catch ' Handle Message Queuing exceptions. ' Handle invalid serialization format. Catch e As InvalidOperationException Console.WriteLine(e.Message) End Try ' Catch other exceptions as necessary. Return returnString End Function 'ReceiveMessage '************************************************** ' Receives a message containing an Order. '************************************************** Public Sub ReceiveAcknowledgment(messageId As String, queuePath As String) Dim found As Boolean = False Dim queue As New MessageQueue(queuePath) queue.MessageReadPropertyFilter.CorrelationId = True queue.MessageReadPropertyFilter.Acknowledgment = True Try While Not (queue.PeekByCorrelationId(messageId) Is Nothing) Dim myAcknowledgmentMessage As Message = queue.ReceiveByCorrelationId(messageId) ' Output acknowledgment message information. The correlation Id is identical ' to the id of the original message. Console.WriteLine("Acknowledgment Message Information--") Console.WriteLine(("Correlation Id: " + myAcknowledgmentMessage.CorrelationId.ToString())) Console.WriteLine(("Id: " + myAcknowledgmentMessage.Id.ToString())) Console.WriteLine(("Acknowledgment Type: " + myAcknowledgmentMessage.Acknowledgment.ToString())) Console.WriteLine("____________________________________________") found = True End While Catch e As InvalidOperationException ' This exception would be thrown if there is no (further) acknowledgment message ' with the specified correlation Id. Only output a message if there are no messages; ' not if the loop has found at least one. If found = False Then Console.WriteLine(e.Message) End If End Try End Sub 'ReceiveAcknowledgment ' Handle other causes of invalid operation exception. End Class 'MyNewQueue End Namespace 'MyProject [C#] using System; using System.Messaging; namespace MyProject { /// <summary> /// Provides a container class for the example. /// </summary> public class MyNewQueue { //************************************************** // Provides an entry point into the application. // // This example sends and receives a message from // a queue. //************************************************** public static void Main() { // Create a new instance of the class. MyNewQueue myNewQueue = new MyNewQueue(); // Create new queues. CreateQueue(".\\myQueue"); CreateQueue(".\\myAdministrationQueue"); // Send messages to a queue. myNewQueue.SendMessage(); // Receive messages from a queue. string messageId = myNewQueue.ReceiveMessage(); // Receive acknowledgment message. if(messageId != null) { myNewQueue.ReceiveAcknowledgment(messageId, ".\\myAdministrationQueue"); } return; } //************************************************** // Creates a new queue. //************************************************** public static void CreateQueue(string queuePath) { try { if(!MessageQueue.Exists(queuePath)) { MessageQueue.Create(queuePath); } else { Console.WriteLine(queuePath + " already exists."); } } catch (MessageQueueException e) { Console.WriteLine(e.Message); } } //************************************************** // Sends a string message to a queue. //************************************************** public void SendMessage() { // Connect to a queue on the local computer. MessageQueue myQueue = new MessageQueue(".\\myQueue"); // Create a new message. Message myMessage = new Message("Original Message"); myMessage.AdministrationQueue = new MessageQueue(".\\myAdministrationQueue"); myMessage.AcknowledgeType = AcknowledgeTypes.PositiveReceive | AcknowledgeTypes.PositiveArrival; // Send the Order to the queue. myQueue.Send(myMessage); return; } //************************************************** // Receives a message containing an Order. //************************************************** public string ReceiveMessage() { // Connect to the a queue on the local computer. MessageQueue myQueue = new MessageQueue(".\\myQueue"); myQueue.MessageReadPropertyFilter.CorrelationId = true; // Set the formatter to indicate body contains an Order. myQueue.Formatter = new XmlMessageFormatter(new Type[] {typeof(string)}); string returnString = null; try { // Receive and format the message. Message myMessage = myQueue.Receive(); // Display message information. Console.WriteLine("____________________________________________"); Console.WriteLine("Original message information--"); Console.WriteLine("Body: " +myMessage.Body.ToString()); Console.WriteLine("Id: " + myMessage.Id.ToString()); Console.WriteLine("____________________________________________"); returnString = myMessage.Id; } catch (MessageQueueException) { // Handle Message Queuing exceptions. } // Handle invalid serialization format. catch (InvalidOperationException e) { Console.WriteLine(e.Message); } // Catch other exceptions as necessary. return returnString; } //************************************************** // Receives a message containing an Order. //************************************************** public void ReceiveAcknowledgment(string messageId, string queuePath) { bool found = false; MessageQueue queue = new MessageQueue(queuePath); queue.MessageReadPropertyFilter.CorrelationId = true; queue.MessageReadPropertyFilter.Acknowledgment = true; try { while(queue.PeekByCorrelationId(messageId) != null) { Message myAcknowledgmentMessage = queue.ReceiveByCorrelationId(messageId); // Output acknowledgment message information. The correlation Id is identical // to the id of the original message. Console.WriteLine("Acknowledgment Message Information--"); Console.WriteLine("Correlation Id: " + myAcknowledgmentMessage.CorrelationId.ToString()); Console.WriteLine("Id: " + myAcknowledgmentMessage.Id.ToString()); Console.WriteLine("Acknowledgment Type: " + myAcknowledgmentMessage.Acknowledgment.ToString()); Console.WriteLine("____________________________________________"); found = true; } } catch (InvalidOperationException e) { // This exception would be thrown if there is no (further) acknowledgment message // with the specified correlation Id. Only output a message if there are no messages; // not if the loop has found at least one. if(found == false) { Console.WriteLine(e.Message); } // Handle other causes of invalid operation exception. } } } } [C++] #using <mscorlib.dll> #using <system.dll> #using <system.messaging.dll> using namespace System; using namespace System::Messaging; __gc class MyNewQueue { public: static void CreateQueue(String* queuePath) { try { if (!MessageQueue::Exists(queuePath)) { MessageQueue::Create(queuePath); } else { Console::WriteLine("{0} already exists.", queuePath ); } } catch (MessageQueueException* e) { Console::WriteLine(e->Message); } } public: void SendMessage() { // Connect to a queue on the local computer. MessageQueue* myQueue = new MessageQueue(S".\\myQueue"); // Create a new message. Message* myMessage = new Message(S"Original Message"); myMessage->AdministrationQueue = new MessageQueue(S".\\myAdministrationQueue"); myMessage->AcknowledgeType = (AcknowledgeTypes)(AcknowledgeTypes::PositiveReceive | AcknowledgeTypes::PositiveArrival); // Send the Order to the queue. myQueue->Send(myMessage); return; } public: String* ReceiveMessage() { // Connect to the a queue on the local computer. MessageQueue* myQueue = new MessageQueue(S".\\myQueue"); myQueue->MessageReadPropertyFilter->CorrelationId = true; Type* p __gc[] = new Type*[1]; p[0] = __typeof(String); myQueue->Formatter = new XmlMessageFormatter( p ); String* returnString = 0; try { // Receive and format the message. Message* myMessage = myQueue->Receive(); // Display message information. Console::WriteLine(S"____________________________________________"); Console::WriteLine(S"Original message information--"); Console::WriteLine(S"Body: {0}", myMessage->Body); Console::WriteLine(S"Id: {0}", myMessage->Id); Console::WriteLine(S"____________________________________________"); returnString = myMessage->Id; } catch (MessageQueueException*) { // Handle Message Queuing exceptions. } // Handle invalid serialization format. catch (InvalidOperationException* e) { Console::WriteLine(e->Message); } // Catch other exceptions as necessary. return returnString; } public: void ReceiveAcknowledgment(String* messageId, String* queuePath) { bool found = false; MessageQueue* queue = new MessageQueue(queuePath); queue->MessageReadPropertyFilter->CorrelationId = true; queue->MessageReadPropertyFilter->Acknowledgment = true; try { while(queue->PeekByCorrelationId(messageId) != 0) { Message* myAcknowledgmentMessage = queue->ReceiveByCorrelationId(messageId); // Output acknowledgment message information. The correlation Id is identical // to the id of the original message. Console::WriteLine(S"Acknowledgment Message Information--"); Console::WriteLine(S"Correlation Id: {0}", myAcknowledgmentMessage->CorrelationId); Console::WriteLine(S"Id: {0}", myAcknowledgmentMessage->Id); Console::WriteLine(S"Acknowledgment Type: {0}", __box(myAcknowledgmentMessage->Acknowledgment)); Console::WriteLine(S"____________________________________________"); found = true; } } catch (InvalidOperationException* e) { // This exception would be thrown if there is no (further) acknowledgment message // with the specified correlation Id. Only output a message if there are no messages; // not if the loop has found at least one. if (found == false) { Console::WriteLine(e->Message); } // Handle other causes of invalid operation exception. } } }; int main() { // Create a new instance of the class. MyNewQueue* myNewQueue = new MyNewQueue(); // Create new queues. MyNewQueue::CreateQueue(S".\\myQueue"); MyNewQueue::CreateQueue(S".\\myAdministrationQueue"); // Send messages to a queue. myNewQueue->SendMessage(); // Receive messages from a queue. String* messageId = myNewQueue->ReceiveMessage(); // Receive acknowledgment message. if (messageId != 0) { myNewQueue->ReceiveAcknowledgment(messageId, S".\\myAdministrationQueue"); } return 0; }
[JScript] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button
in the upper-left corner of the page.
See Also
MessageQueue Class | MessageQueue Members | System.Messaging Namespace