Windows Communication Foundation para enfileiramento de mensagens
O Windows Communication Foundation para enfileiramento de mensagens demonstra como um aplicativo WCF (Windows Communication Foundation) pode enviar uma mensagem para um aplicativo MSMQ (Enfileiramento de Mensagens). O serviço é um aplicativo de console auto-hospedado que permite que você observe o serviço que está recebendo mensagens na fila. O serviço e o cliente não precisam estar em execução ao mesmo tempo.
O serviço recebe mensagens da fila e processa pedidos. O serviço cria uma fila transacional e configura um manipulador de mensagens recebida por mensagem, conforme mostrado no código de exemplo a seguir.
static void Main(string[] args)
{
if (!MessageQueue.Exists(
ConfigurationManager.AppSettings["queueName"]))
MessageQueue.Create(
ConfigurationManager.AppSettings["queueName"], true);
//Connect to the queue
MessageQueue Queue = new
MessageQueue(ConfigurationManager.AppSettings["queueName"]);
Queue.ReceiveCompleted +=
new ReceiveCompletedEventHandler(ProcessOrder);
Queue.BeginReceive();
Console.WriteLine("Order Service is running");
Console.ReadLine();
}
Quando uma mensagem é recebida na fila, o manipulador de mensagens ProcessOrder
é invocado.
public static void ProcessOrder(Object source,
ReceiveCompletedEventArgs asyncResult)
{
try
{
// Connect to the queue.
MessageQueue Queue = (MessageQueue)source;
// End the asynchronous receive operation.
System.Messaging.Message msg =
Queue.EndReceive(asyncResult.AsyncResult);
msg.Formatter = new System.Messaging.XmlMessageFormatter(
new Type[] { typeof(PurchaseOrder) });
PurchaseOrder po = (PurchaseOrder) msg.Body;
Random statusIndexer = new Random();
po.Status = PurchaseOrder.OrderStates[statusIndexer.Next(3)];
Console.WriteLine("Processing {0} ", po);
Queue.BeginReceive();
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
O serviço extrai o ProcessOrder
do corpo da mensagem MSMQ e processa a ordem.
O nome da fila MSMQ é especificado em uma seção appSettings do arquivo de configuração, conforme mostrado na configuração da amostra.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Observação
O nome da fila usa um ponto (.) para o computador local e separadores de barra invertida no caminho.
O cliente cria uma ordem de compra e envia a ordem de compra dentro do escopo de uma transação, conforme mostrado no código de exemplo a seguir.
// Create the purchase order
PurchaseOrder po = new PurchaseOrder();
// Fill in the details
...
OrderProcessorClient client = new OrderProcessorClient("OrderResponseEndpoint");
MsmqMessage<PurchaseOrder> ordermsg = new MsmqMessage<PurchaseOrder>(po);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
client.SubmitPurchaseOrder(ordermsg);
scope.Complete();
}
Console.WriteLine("Order has been submitted:{0}", po);
//Closing the client gracefully closes the connection and cleans up resources
client.Close();
O cliente usa um cliente personalizado para enviar a mensagem MSMQ para a fila. Como o aplicativo que recebe e processa a mensagem é um aplicativo MSMQ e não um aplicativo WCF, não há nenhum contrato de serviço implícito entre os dois aplicativos. Portanto, não é possível criar um proxy usando a ferramenta Svcutil.exe neste cenário.
O cliente personalizado é essencialmente o mesmo para todos os aplicativos WCF que usam a associação MsmqIntegration
para enviar mensagens. Ao contrário de outros clientes, ele não inclui uma variedade de operações de serviço. É apenas uma operação de mensagem de envio.
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true, Action = "*")]
void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}
public partial class OrderProcessorClient : System.ServiceModel.ClientBase<IOrderProcessor>, IOrderProcessor
{
public OrderProcessorClient(){}
public OrderProcessorClient(string configurationName)
: base(configurationName)
{ }
public OrderProcessorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress address)
: base(binding, address)
{ }
public void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg)
{
base.Channel.SubmitPurchaseOrder(msg);
}
}
Quando você executa o exemplo, as atividades de cliente e de serviço são exibidas nas janelas do serviço e do console do cliente. Você pode ver o serviço receber mensagens do cliente. Pressione ENTER em cada janela do console para desligar o serviço e o cliente. Observe que, como a fila está em uso, o cliente e o serviço não precisam estar em funcionamento ao mesmo tempo. Por exemplo, você poderia executar o cliente, desligá-lo e, em seguida, iniciar o serviço, e ele ainda receberia as mensagens.
Observação
Este exemplo requer a instalação do Enfileiramento de Mensagens. Confira as instruções de instalação no Enfileiramento de Mensagens.
Configurar, compilar e executar a amostra
Verifique se você executou o Procedimento de instalação única para os exemplos do Windows Communication Foundation.
Se o serviço for executado primeiro, ele verificará se a fila está presente. Se a fila não estiver presente, o serviço criará uma. Você pode executar o serviço primeiro para criar a fila ou pode criar uma por meio do Gerenciador de Filas do MSMQ. Siga estas etapas para criar uma fila no Windows 2008.
Abra o Gerenciador do Servidor no Visual Studio 2012.
Expanda a guia Recursos.
Clique com o botão direito do mouse em Filas de Mensagens Privadas e, selecione Nova>Fila Privada.
Marque a caixa Transacional.
Insira
ServiceModelSamplesTransacted
como o nome da nova fila.
Para compilar a edição C# ou Visual Basic da solução, siga as instruções contidas em Como compilar os exemplos do Windows Communication Foundation.
Para executar o exemplo em uma configuração de computador único, siga as instruções em Como executar os exemplos do Windows Communication Foundation.
Executar o exemplo em vários computadores
Copie os arquivos do programa de serviço da pasta \service\bin\, na pasta específica do idioma, para o computador de serviço.
Copie os arquivos do programa cliente da pasta \client\bin\ na pasta específica do idioma, para o computador cliente.
No arquivo Client.exe.config, altere o endereço do ponto de extremidade cliente para especificar o nome do computador de serviço em vez de ".".
No computador de serviço, inicie Service.exe a partir de um prompt de comando.
No computador cliente, inicie Client.exe a partir de um prompt de comando.