次の方法で共有


セッションでキューに置かれたメッセージのグループ化

Windows Communication Foundation (WCF) には、単一の受信側アプリケーションで処理できるよう、一連の関連メッセージをグループ化するセッションが用意されています。セッションに含まれるメッセージは、同じトランザクションに含まれる必要があります。すべてのメッセージが同じトランザクションに含まれるため、1 つのメッセージの処理が失敗すると、セッション全体がロールバックされます。各セッションは、配信不能キューや有害キューに関してよく似た動作をします。キューに置かれたバインディングに設定される有効期間 (TTL: Time To Live) プロパティがセッションに構成されている場合は、セッション全体に適用されます。したがって、TTL が切れる前にセッション内の一部のメッセージが送信された場合は、セッション全体が配信不能キューに配置されます。同様に、アプリケーション キューからアプリケーションにセッション内のメッセージを送信できなかった場合は、セッション全体が有害キューに配置されます (有害キューを使用できる場合)。

メッセージのグループ化の例

メッセージのグループ化が役立つ 1 つの例は、注文処理アプリケーションを WCF サービスとして実装する場合です。たとえば、クライアントがこのアプリケーションに多数の項目を含む注文を送信するとします。このクライアントは、項目ごとにサービスを呼び出すため、個別のメッセージが送信されることになります。このため、最初の項目はサーバー A で受信され、2 番目の項目はサーバー B で受信される可能性があります。項目が追加されるたびに、この項目を処理するサーバーは適切な注文を見つけて項目を追加する必要があるため、効率が非常に悪くなります。すべての要求を 1 台のサーバーのみで処理する場合でも、現在処理中のすべての注文をこのサーバーによって常に把握し、新しい項目がどの注文に属するものなのかを判別する必要があるため、同様の非効率が生じます。単一の注文に属するすべての要求をグループ化すると、このようなアプリケーションの実装は大幅に簡素化されます。1 つの注文に属するすべての項目が 1 セッションとしてクライアント アプリケーションから送信されるため、サービスは注文を処理するときにセッション全体を 1 回で処理できます。\

プロシージャ

セッションを使用するようにサービス コントラクトを設定するには

  1. セッションを必要とするサービス コントラクトを定義します。これを実行するには、OperationContractAttribute 属性に次の値を指定します。

    SessionMode=SessionMode.Required
    
  2. これらのメソッドは何も返さないため、コントラクト内の操作を一方向としてマークします。これを実行するには、OperationContractAttribute 属性に次の値を指定します。

    [OperationContract(IsOneWay = true)]
    
  3. サービス コントラクトを実装し、InstanceContextModePerSession を指定します。これにより、セッションごとに 1 回だけサービスがインスタンス化されます。

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
    
  4. 各サービス操作には、トランザクションが必要になります。これを指定するには OperationBehaviorAttribute 属性を使用します。トランザクションを完了する操作では、TransactionAutoCompletetrue に設定する必要があります。

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
    
  5. システム指定の NetProfileMsmqBinding バインディングを使用するエンドポイントを構成します。

  6. System.Messaging を使用してトランザクション キューを作成します。代わりに、MSMQ (メッセージ キュー) または MMC を使用してキューを作成することもできます。この場合、トランザクション キューを作成します。

  7. ServiceHost を使用して、サービスのサービス ホストを作成します。

  8. サービス ホストを開いてサービスを使用できるようにします。

  9. サービス ホストを閉じます。

クライアントを設定するには

  1. トランザクションのスコープを作成してトランザクション キューに書き込みます。

  2. ServiceModel Metadata Utility Tool (Svcutil.exe) ツールを使用して、WCF クライアントを作成します。

  3. 注文を行います。

  4. WCF クライアントを閉じます。

説明

次の例では、IProcessOrder サービス、およびこのサービスを使用するクライアントのコードを示します。このコードは、WCF が、キューに置かれたセッションを使用して動作をグループ化するしくみを示しています。

サービスのコード

クライアントのコード

関連項目

概念

キューの概要

その他の技術情報

Sessions and Queues Sample