Поделиться через


Очередь сообщений в Windows Communication Foundation

В примере MsmqToWcf показано, как приложение очереди сообщений (MSMQ) может отправлять сообщение MSMQ в службу Windows Communication Foundation (WCF). Служба — это локальное консольное приложение, позволяющее наблюдать за службой, получающей сообщения в очереди.

Контракт службы IOrderProcessor определяет одностороннюю службу, которая подходит для использования с очередями. В сообщении MSMQ нет заголовка действия, поэтому невозможно автоматически сопоставить различные сообщения MSMQ с контрактами операций. Таким образом, может быть только один операционный контракт. Если вы хотите определить несколько контрактов операций для службы, приложение должно предоставить сведения о том, какой заголовок в сообщении MSMQ (например, метка или correlationID) можно использовать, чтобы определить, какой контракт операции выполнять.

Сообщение MSMQ не содержит сведений о том, какие заголовки сопоставляются с разными параметрами контракта операции. Параметр имеет тип MsmqMessage<T>(MsmqMessage<T>), содержащий базовое сообщение MSMQ. Тип "T" в классе MsmqMessage<T>(MsmqMessage<T>) представляет данные, сериализованные в тело сообщения MSMQ. В этом примере тип PurchaseOrder сериализуется в тело сообщения MSMQ.

В следующем примере кода показан контракт службы службы обработки заказов.

// 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);
}

Служба размещена на собственных серверах. При использовании MSMQ необходимо заранее создать очередь. Это можно сделать вручную или с помощью кода. В этом примере служба проверяет наличие очереди и создает ее при необходимости. Имя очереди считывается из файла конфигурации.

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);
    …
}

Служба создает и открывает ServiceHost для OrderProcessorService, как показано в следующем примере кода.

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();
}

Имя очереди MSMQ указывается в разделе appSettings файла конфигурации, как показано в следующем примере конфигурации.

Замечание

Имя очереди использует точку (.) для локального компьютера и обратные косые черты как разделители в пути. Адрес конечной точки WCF указывает схему msmq.formatname и использует localhost для локального компьютера. Адрес очереди для каждого правила адресации имен формата MSMQ следует схеме msmq.formatname.

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

Клиентское приложение — это приложение MSMQ, использующее Send метод для отправки устойчивого и транзакционного сообщения в очередь, как показано в следующем примере кода.

//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();

При запуске примера действия клиента и службы отображаются как в окнах службы, так и в консоли клиента. Вы можете увидеть, как служба получает сообщения от клиента. Нажмите клавишу ВВОД в каждом окне консоли, чтобы завершить работу службы и клиента. Обратите внимание, что поскольку используется очередь, клиенту и службе не обязательно работать одновременно. Например, вы можете запустить клиент, завершить его работу, а затем запустить службу, и она будет по-прежнему получать свои сообщения.

Настройка, сборка и запуск примера

  1. Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.

  2. Если сначала запущена служба, она проверит наличие очереди. Если очередь отсутствует, служба создаст ее. Сначала можно запустить службу для создания очереди или создать ее с помощью диспетчера очередей MSMQ. Выполните следующие действия, чтобы создать очередь в Windows 2008.

    1. Откройте диспетчер серверов в Visual Studio 2012.

    2. Разверните вкладку "Функции" .

    3. Щелкните правой кнопкой мыши Очереди частных сообщенийи выберите Создать, Частную очередь.

    4. Установите флажок транзакционная.

    5. Введите ServiceModelSamplesTransacted в качестве имени новой очереди.

  3. Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .

  4. Чтобы запустить пример в конфигурации с одним компьютером, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".

Запустите пример на нескольких компьютерах

  1. Скопируйте файлы программы службы из папки \service\bin\ соответствующего языка на компьютер службы.

  2. Скопируйте файлы клиентской программы из папки \client\bin\ в папку, соответствующую конкретному языку, на клиентский компьютер.

  3. В файле Client.exe.config измените параметр orderQueueName, чтобы указать имя компьютера для сервиса вместо ".".

  4. На компьютере службы запустите Service.exe из командной строки.

  5. На клиентском компьютере запустите Client.exe из командной строки.

См. также