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