RPC-Message キュー アプリケーションの開発
RPC アプリケーションで MSMQ トランスポートを利用するために必要な作業はほとんどありません。 同期メッセージングの場合は、プロトコル シーケンスとしてメッセージ キュー トランスポート (ncadg_mq) のみを指定する必要があります。 ncadg_mq プロトコルは、通話のブロードキャストを除くすべての標準データグラム機能をサポートしています。 また、現在、メッセージ キュー トランスポートでは動的エンドポイントがサポートされていないことに注意してください。
IDL ファイルのリモート プロシージャ宣言に [message] 属性を適用すると、それらの呼び出しに対して非同期モードのメッセージ キューが自動的に実装されます。 これにより、次のようなメッセージおよびメッセージ キューに関連付けられているプロパティの多くを、クライアント アプリケーションとサーバー アプリケーションが制御できるようになります。
- サービスの品質
- 受信確認
- ジャーナリング
- 通話の優先度
- サーバー プロセス キューの永続化
サービスの品質は、サーバー プロセスに呼び出しを配信するためにトランスポートが行う作業です。 高速配信はメモリ内でキューに登録されるため、かなり高速ですが、コンピューターまたはネットワーク接続が間違った時刻にダウンした場合、呼び出しは失われます。 回復可能な配信は、配信されるまでディスク ファイルにポストされるため、コンピューターのクラッシュが発生しても通話は失われません。 これにより、確実な配信が可能になりますが、各呼び出しがディスクに書き込まれるので、パフォーマンスは高くなります。
また、MSMQ トランスポートに対して、呼び出しが宛先 (サーバー) キューに到達したことを確認するまで待機してから、返すこともできます。 このオプションを選択すると、サーバーが呼び出しを確認するまでクライアントがブロックされ、それ以外の場合、制御は呼び出しの直後にクライアントに戻ります。
ジャーナリングを使用すると、呼び出しをディスクに記録できます。 ジャーナリングが有効になっている場合、各呼び出しは、サーバー プロセスに向かう途中で次ホップに送信されるときにディスクに記録されます。
呼び出し優先度を RPC [message] 関数属性と組み合わせて使用すると、優先度の高い呼び出しが後で到着した場合でも、優先順位の高い呼び出しよりも優先順位の高い呼び出しが優先されます。 呼び出しの優先度も、同期 RPC では限定的に機能しますが、同期 RPC 呼び出しは非同期呼び出しと同じ方法でスタックアップすることはできません。
クライアント プロセスは、 RpcBindingSetOption を呼び出すことによって、上記のすべてのプロパティを制御します。 設定すると、これらのプロパティは 、RpcBindingSetOption の別の呼び出しで変更されるまで有効になります。
RPC サーバー プロセスは、受信キューの有効期間を制御できます。 既定では、サーバー プロセスが終了するとキューが削除されます。 ただし、サーバー プロセスでは、エンドポイントを設定するときに RpcServerUseProtseqEpEx を使用して、キューが存在し続けることを許可し、サーバー プロセスが実行されていない場合でも呼び出し要求を受け入れるようにトランスポートに指示できます。 この場合、呼び出しはキューに登録され、後でサーバー プロセスがオンラインに戻ったときに実行されます。
Note
インターフェイスで非同期 [message] 呼び出しを使用している場合は、RpcServerUseProtseqEpEx(ncadg_mq) を呼び出す前に、RpcServerRegisterIf または RpcServerRegisterIfEx を呼び出してインターフェイスを登録する必要があります。 プロトコル シーケンスを有効にすると、サーバーのキューで既に待機している呼び出しはすべて、キューから読み取りを開始します。 対応する RPC インターフェイスが登録されていない場合、呼び出しは失敗します。 この状況は、リモート プロシージャ コール用に永続的なエンドポイントを設定し、サーバーがシャットダウンされ、クライアントが引き続きサーバーに呼び出しを送信している場合に発生する可能性があります。 これらの呼び出しはキューにスタックされ、サーバーがオンラインに戻ったら読み取られるのを待ちます。
詳細については、「 RpcBindingSetOption」、「 RpcServerUseProtseqEpEx」、および「[message], ncadg_mq」を参照してください。