Expand Minimize

AcknowledgeTypes Enumeration

Specifies the types of acknowledgment message that Message Queuing returns to the sending application.

This enumeration has a FlagsAttribute attribute that allows a bitwise combination of its member values.

Namespace:  System.Messaging
Assembly:  System.Messaging (in System.Messaging.dll)

[FlagsAttribute]
public enum AcknowledgeTypes

Member nameDescription
Supported by the .NET Compact FrameworkPositiveArrivalA mask used to request a positive acknowledgment when the original message reaches the queue.
Supported by the .NET Compact FrameworkPositiveReceiveA mask used to request a positive acknowledgment when the original message is successfully retrieved from the queue.
Supported by the .NET Compact FrameworkNegativeReceiveA mask used to request a negative acknowledgment when the original message fails to be received from the queue.

Using the MessageQueue.Peek method does not remove a message from the queue, so this acknowledgment type could be returned even if you did peek the message. Only the MessageQueue.Receive method (or the related asynchronous MessageQueue.BeginReceive method) removes a message from the queue.

Supported by the .NET Compact FrameworkNoneA mask used to request that no acknowledgment messages (positive or negative) be posted.
Supported by the .NET Compact FrameworkNotAcknowledgeReachQueueA mask used to request a negative acknowledgment when the original message cannot reach the queue. This can happen when the time-to-reach-queue timer expires or if a message cannot be authenticated.
Supported by the .NET Compact FrameworkNotAcknowledgeReceiveA mask used to request a negative acknowledgment when an error occurs that prevents the original message from being received from the queue before its time-to-be-received timer expires.
Supported by the .NET Compact FrameworkFullReachQueueA mask used to request positive acknowledgment if the original message reaches the queue or negative acknowledgment if the time-to-reach-queue timer expires or if the original message cannot be authenticated.
Supported by the .NET Compact FrameworkFullReceiveA mask used to request positive acknowledgment if the original message is received from the queue before its time-to-be-received timer expires or negative acknowledgment otherwise.

The AcknowledgeTypes class provides a set of flags that you can combine to request one or more categories of acknowledgment messages.

When an application sends a message, it can request that Message Queuing return acknowledgment messages indicating the success or failure of the original message. Message Queuing sends these acknowledgment messages to the administration queue you specify. Acknowledgment types can be divided broadly into four groups: positive arrival acknowledgments, positive read acknowledgments, negative arrival acknowledgments, and negative read acknowledgments. Requesting acknowledgments enables your application to receive notification of certain occurrences—for example, a message reaching its destination queue, a message being retrieved, or a time-out preventing a message from reaching or being retrieved from the destination queue.

When you are using the Message class to send messages to a queue, you specify the types of acknowledgments your application should receive in the AcknowledgeType property, as well as the administration queue that receives the acknowledgment messages in the AdministrationQueue property.

When you use the Message class to read acknowledgment messages in the administration queue, the instance's Acknowledgment property indicates the condition responsible for the acknowledgment message, for example, if a time-out expired before the original message was read from the queue.

The following code example sends and receives a message that contains an order to and from a queue. It specifically requests a positive acknowledgment when the original message reaches or is retrieved from the queue.

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.
			}

		}
	}
}
#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;
}

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

.NET Framework

Supported in: 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Supported in: 3.5, 2.0
Was this page helpful?
(1500 characters remaining)
Thank you for your feedback

Community Additions

ADD
Show:
© 2014 Microsoft