segunda-feira, 19 de março de 2012

Message Queuing to Windows Communication Foundation


Message Queuing to Windows Communication Foundation
Este exemplo demonstra como um aplicativo Message Queuing (MSMQ) pode enviar uma mensagem MSMQ para um serviço Windows Communication Foundation (WCF). O serviço é um aplicativo de console auto-hospedado para que você possa observar o serviço de recebimento de mensagens em fila.

O contrato de serviço é IOrderProcessor , que define um serviço de uma maneira, isto é adequado para uso com as filas. Uma mensagem de MSMQ não tem um cabeçalho de ação, de modo que não é possível para mapear diferentes mensagens MSMQ para contratos de operação automaticamente.Portanto, só pode haver um contrato de operação. Se você quiser definir mais de um contrato de operação para o serviço, o aplicativo deve fornecer informações a respeito de qual cabeçalho na mensagem MSMQ (por exemplo, o rótulo ou CorrelationId) pode ser usada para decidir qual o contrato de operação para despachar. Isto é demonstrado na Demux personalizado .

A mensagem MSMQ não contém informações a respeito de que os cabeçalhos são mapeados para os diferentes parâmetros do contrato de operação. O parâmetro é do tipo MSMQMessage (MSMQMessage <T> ), que contém a mensagem MSMQ subjacente. O tipo "T" no MSMQMessage (MSMQMessage <T> classe) representa os dados que é serializado no corpo da mensagem MSMQ.Nesta amostra, o PurchaseOrder tipo é serializado no corpo da mensagem MSMQ.

O código de exemplo a seguir mostra o contrato de serviço do serviço de processamento de pedidos.

// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
[ServiceKnownType(typeof(PurchaseOrder))]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}

O serviço é auto-hospedado. Ao usar MSMQ, a fila utilizado deve ser criado com antecedência. Isto pode ser feito manualmente ou através de código. Neste exemplo, o serviço verifica a existência da fila e cria-se necessário. O nome da fila é lido do arquivo de configuração.

public static void Main()
{
    // Get the MSMQ queue name from the application settings in 
    // configuration.
    string queueName = ConfigurationManager.AppSettings["queueName"];
    // Create the MSMQ queue if necessary.
    if (!MessageQueue.Exists(queueName))
        MessageQueue.Create(queueName, true);
    
}

O serviço cria e abre um ServiceHost para o OrderProcessorService , como mostrado no seguinte código de exemplo.

using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{
    serviceHost.Open();
    Console.WriteLine("The service is ready.");
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.ReadLine();
    serviceHost.Close();
}

O nome da fila MSMQ é especificado em uma secção appSettings do ficheiro de configuração, como mostrado no exemplo de configuração seguinte.
<appSettings>
    <add key="orderQueueName" value=".\private$\Orders" />
</ AppSettings>

A aplicação cliente é uma aplicação que usa o MSMQ Enviar método para enviar uma mensagem durável e transacional para a fila, como mostrado no seguinte código de exemplo.

//Connect to the queue.
MessageQueue orderQueue = new MessageQueue(ConfigurationManager.AppSettings["orderQueueName"]);
 
// Create the purchase order.
PurchaseOrder po = new PurchaseOrder();
po.CustomerId = "somecustomer.com";
po.PONumber = Guid.NewGuid().ToString();
 
PurchaseOrderLineItem lineItem1 = new PurchaseOrderLineItem();
lineItem1.ProductId = "Blue Widget";
lineItem1.Quantity = 54;
lineItem1.UnitCost = 29.99F;
 
PurchaseOrderLineItem lineItem2 = new PurchaseOrderLineItem();
lineItem2.ProductId = "Red Widget";
lineItem2.Quantity = 890;
lineItem2.UnitCost = 45.89F;
 
po.orderLineItems = new PurchaseOrderLineItem[2];
po.orderLineItems[0] = lineItem1;
po.orderLineItems[1] = lineItem2;
 
// Submit the purchase order.
Message msg = new Message();
msg.Body = po;
//Create a transaction scope.
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    
    orderQueue.Send(msg, MessageQueueTransactionType.Automatic);
    // Complete the transaction.
    scope.Complete();
   
}
Console.WriteLine("Placed the order:{0}", po);
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();

Quando você executar o exemplo, as atividades do cliente e do serviço são exibidos em tanto o serviço e cliente Windows do console. Você pode ver o serviço de receber mensagens do cliente. Pressione a tecla ENTER em cada janela de console para desligar o serviço eo cliente. Observe que, como filas está em uso, o cliente eo serviço não precisa ser instalado e funcionando ao mesmo tempo. Por exemplo, você poderia executar o cliente, desligá-lo, e então iniciar o serviço e ainda receber suas mensagens.

Nenhum comentário:

Postar um comentário