Partilhar via


Windows Communication Foundation para Enfileiramento de Mensagens

O exemplo WcfToMsmq demonstra como um aplicativo Windows Communication Foundation (WCF) pode enviar uma mensagem para um aplicativo de enfileiramento de mensagens (MSMQ). O serviço é um aplicativo de console auto-hospedado para permitir que você observe o serviço 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 recebidas, 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 ProcessOrder de mensagens é 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 de exemplo a seguir.

<appSettings>
    <add key="orderQueueName" value=".\private$\Orders" />
</appSettings>

Nota

O nome da fila usa um ponto (.) para o computador local e separadores de barra invertida em seu 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 na ordem 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 podemos 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 MsmqIntegration associação para enviar mensagens. Ao contrário de outros clientes, não inclui uma gama de operações de serviço. É apenas uma operação de envio de mensagem.

[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 do cliente e do serviço são exibidas nas janelas do console do serviço e 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 o enfileiramento está em uso, o cliente e o serviço não precisam estar funcionando ao mesmo tempo. Por exemplo, você poderia executar o cliente, desligá-lo e, em seguida, iniciar o serviço e ele ainda receberia suas mensagens.

Nota

Este exemplo requer a instalação do serviço de enfileiramento de mensagens. Consulte as instruções de instalação em Enfileiramento de Mensagens.

Configurar, compilar e executar o exemplo

  1. Certifique-se de ter executado o procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. 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 MSMQ. Siga estas etapas para criar uma fila no Windows 2008.

    1. Abra o Gerenciador do Servidor no Visual Studio 2012.

    2. Expanda a guia Recursos .

    3. Clique com o botão direito do mouse em Filas de Mensagens Privadas e selecione Nova>Fila Privada.

    4. Marque a caixa Transacional .

    5. Digite ServiceModelSamplesTransacted como o nome da nova fila.

  3. Para criar a edição C# ou Visual Basic da solução, siga as instruções em Criando os exemplos do Windows Communication Foundation.

  4. Para executar o exemplo em uma configuração de computador único, siga as instruções em Executando os exemplos do Windows Communication Foundation.

Execute o exemplo em todos os computadores

  1. Copie os arquivos do programa de serviço da pasta \service\bin\, na pasta específica do idioma, para o computador de serviço.

  2. Copie os arquivos de programa cliente da pasta \client\bin\, na pasta específica do idioma, para o computador cliente.

  3. No arquivo Client.exe.config, altere o endereço do ponto de extremidade do cliente para especificar o nome do computador de serviço em vez de ".".

  4. No computador de serviço, inicie Service.exe a partir de um prompt de comando.

  5. No computador cliente, inicie Client.exe a partir de um prompt de comando.

Consulte também