Windows Communication Foundation でのメッセージ キュー

Download sample

このサンプルでは、Windows Communication Foundation (WCF) アプリケーションでメッセージをメッセージ キュー (MSMQ) アプリケーションに送信する方法について説明します。サービスは、自己ホスト型コンソール アプリケーションで、サービスがキュー内のメッセージを受信したかどうかを監視できます。サービスとクライアントは同時に実行されていなくてもかまいません。

サービスは、メッセージをキューから受信して注文を処理します。サービスはトランザクション キューを作成し、メッセージがメッセージ ハンドラによって受信されるように設定します。次のサンプル コードを参照してください。

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

メッセージがキュー内で受信されると、メッセージ ハンドラ ProcessOrder が呼び出されます。

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

}

サービスは MSMQ メッセージ本文から ProcessOrder を抽出し、注文を処理します。

MSMQ キュー名は、構成ファイルの appSettings セクションに指定されます。次のサンプル構成を参照してください。

<appSettings>
    <add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Noteメモ :

キューの名前では、ローカル コンピュータにはドット (.) が使用され、そのパスにはバックスラッシュが使用されます。

クライアントは発注書を作成してトランザクションのスコープ内に送信します。次のサンプル コードを参照してください。

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

クライアントは、MSMQ メッセージをキューに送信するためにカスタム クライアントを順に使用します。メッセージを受信して処理するアプリケーションが MSMQ アプリケーションであり、WCF アプリケーションではないので、2 つのアプリケーション間で暗黙のサービス コントラクトはありません。したがって、このシナリオでは Svcutil.exe ツールを使用してプロキシを作成することはできません。

カスタム クライアントは基本的に、MsmqIntegration バインディングを使用してメッセージを送信するすべての WCF アプリケーションで同じです。他のクライアントと異なり、サービス操作の範囲は含まれません。メッセージ送信操作のみです。

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

サンプルを実行すると、クライアントとサービスのアクティビティがサービスとクライアントの両方のコンソール ウィンドウに表示されます。サービスがクライアントから受信したメッセージを表示できます。どちらかのコンソールで Enter キーを押すと、サービスとクライアントがどちらもシャットダウンされます。キューが使用されているので、クライアントとサービスが同時に実行されている必要はありません。たとえば、クライアントを実行してシャットダウンした後にサービスを起動しても、サービスはメッセージを受信します。

Noteメモ :

このサンプルを実行するには、メッセージ キューがインストールされている必要があります。インストールの手順については、「メッセージ キュー」を参照してください。

サンプルをセットアップ、作成、および実行するには

  1. Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。

  2. ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。

  3. 単一コンピュータ構成でサンプルを実行するには、「Windows Communication Foundation サンプルの実行」の手順に従います。

サンプルを別のコンピュータで実行するには

  1. サービス プログラム ファイルを、言語固有のフォルダにある \service\bin\ フォルダからサービス コンピュータにコピーします。

  2. クライアント プログラム ファイルを、言語固有のフォルダにある \client\bin\ フォルダからクライアント コンピュータにコピーします。

  3. Client.exe.config ファイルで、クライアント エンドポイントのアドレスを変更して "." の代わりにサービス コンピュータを指定します。

  4. サービス コンピュータで、コマンド プロンプトから Service.exe を起動します。

  5. クライアント コンピュータで、コマンド プロンプトから Client.exe を起動します。

関連項目

その他の技術情報

How To: Exchange Messages with WCF Endpoints and MSMQ applications
メッセージ キュー

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.