Export (0) Print
Expand All
This topic has not yet been rated - Rate this topic

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 Language Filter in the upper-left corner of the page.

See Also

MessageQueue Class | MessageQueue Members | System.Messaging Namespace

Did you find this helpful?
(1500 characters remaining)
Thank you for your feedback
Show:
© 2014 Microsoft. All rights reserved.