19.2.2 リクエストインタセプタ
リクエストインタセプタは,特定のインタセプトポイントでリクエスト/応答シーケンスのフローを受け取るために使用します。これによってサービスはクライアントとサーバ間でコンテキスト情報を転送できます。各インタセプトポイントではBorland Enterprise Server VisiBroker ORBはオブジェクトを与えて,このオブジェクトによってインタセプタはリクエスト情報にアクセスできます。リクエストインタセプタには2種類あり,そのそれぞれにリクエスト情報インタフェースがあります。
-
ClientRequestInterceptorおよびClientRequestInfo
-
ServerRequestInterceptorおよびServerRequestInfo
リクエストのインタセプタポイントを図19-2に示します。
リクエストインタセプタの詳細については,マニュアル「Borland Enterprise Server VisiBroker プログラマーズリファレンス」の「ポータブルインタセプタインタフェースとクラス」の記述を参照してください。
(1) ClientRequestInterceptor
ClientRequestInterceptorには,クライアント側でインプリメントされたインタセプトポイントがあります。
表19-1に示すように,OMGがClientRequestInterceptorで定義しているインタセプトポイントは五つあります。
インタセプトポイント |
説明 |
---|---|
send_request |
クライアント側インタセプタが,リクエストがサーバに送信される前にリクエストを照会して,サービスコンテキストを修正します。 |
send_poll |
クライアント側インタセプタが,TII(時間非依存呼び出し)ポーリング取得応答シーケンス※中にリクエストを照会します。 |
receive_reply |
クライアント側インタセプタが,サーバから応答情報が戻されたあと,クライアントに制御が移る前にその応答情報を照会します。 |
receive_exception |
クライアント側インタセプタが,例外発生時に,その例外がクライアントに送信される前に例外情報を照会します。 |
receive_other |
クライアント側インタセプタが,正常応答または例外以外のリクエスト結果を受け取った場合に利用できる情報を照会します。 |
- 注※
-
TIIはVisiBroker Edition ORBではインプリメントされていません。結果として,send_poll()インタセプトポイントが呼び出されることはありません。
各インタセプトポイントの詳細については,マニュアル「Borland Enterprise Server VisiBroker プログラマーズリファレンス」の「ポータブルインタセプタインタフェースとクラス」の記述を参照してください。
- コードサンプル19-3 ClientRequestInterceptorクラス(C++)
class _VISEXPORT ClientRequestInterceptor:public virtualInterceptor { public: virtual void send_request(ClientRequestInfo_ptr _ri)=0; virtual void send_poll(ClientRequestInfo_ptr _ri)=0; virtual void receive_reply(ClientRequestInfo_ptr _ri)=0; virtual void receive_exception(ClientRequestInfo_ptr _ri)=0; virtual void receive_other(ClientRequestInfo_ptr _ri)=0; }
- コードサンプル19-4 ClientRequestInterceptorインタフェース(Java)
package org.omg.PortableInterceptor; public interface ClientRequestInterceptor extends Interceptor,org.omg.CORBA.portable.IDLEntity, org.omg.CORBA.LocalInterface { public void send_request(ClientRequestInfo ri) throws ForwardRequest; public void send_poll(ClientRequestInfo ri) throws ForwardRequest; public void receive_reply(ClientRequestInfo ri); public void receive_exception(ClientRequestInfo ri) throws ForwardRequest; public void receive_other(ClientRequestInfo ri) throws ForwardRequest; }
クライアント側の規則を次に,具体例を表19-2に示します。
-
開始インタセプトポイントはsend_requestおよびsend_pollです。どのリクエスト/応答シーケンスでも,このインタセプトポイントのどちらか一方だけが呼び出されます。
-
終了インタセプトポイントはreceive_reply,receive_exception,およびreceive_otherです。どのリクエスト/応答シーケンスでも,このインタセプトポイントのどれか一つだけが呼び出されます。
-
中間インタセプトポイントはありません。
-
終了インタセプトポイントは,send_requestまたはsend_pollのどちらかの実行が成功した場合だけ呼び出されます。
-
receive_exceptionは,ORBのシャットダウンによってリクエストがキャンセルされて,マイナーコード4(ORBのシャットダウン)のシステム例外BAD_INV_ORDERが発生すると呼び出されます。
-
receive_exceptionは,リクエストがそのほかの理由によってキャンセルされて,マイナーコード3のシステム例外TRANSIENTが発生すると呼び出されます。
表19‒2 クライアント側の規則の具体例 クライアント側の規則
説明
呼び出し成功
send_requestのあとにreceive_reply。開始点のあとに終了点がきます。
リトライ
send_requestのあとにreceive_other。開始点のあとに終了点がきます。
(2) ServerRequestInterceptor
ServerRequestInterceptorには,サーバ側でインプリメントされたインタセプトポイントがあります。表19-3に示すように,OMGがServerRequestInterceptorで定義しているインタセプトポイントは五つあります。
インタセプトポイント |
説明 |
---|---|
receive_request_service_contexts |
サーバ側インタセプタが,入力リクエストからそのサービスコンテキスト情報を取得して,それをPortableInterceptor::Currentのスロットに転送します。 |
receive_request |
サーバ側インタセプタが,オペレーションパラメタのようなすべての情報が利用可能になってから,リクエスト情報を照会します。 |
send_reply |
サーバ側インタセプタが,ターゲットのオペレーションが呼び出されたあと,クライアントに応答が戻される前に応答情報を照会して,応答サービスコンテキストを修正します。 |
send_exception |
サーバ側インタセプタが,例外発生時に,その例外がクライアントに送信される前に例外情報を照会して応答サービスコンテキストを修正します。 |
send_other |
サーバ側インタセプタが,正常応答または例外以外のリクエスト結果を受け取った場合に利用できる情報を照会します。 |
各インタセプトポイントの詳細については,マニュアル「Borland Enterprise Server VisiBroker プログラマーズリファレンス」の「ポータブルインタセプタインタフェースとクラス」の記述を参照してください。
- コードサンプル19-5 ServerRequestInterceptorクラス(C++)
class _VISEXPORT ServerRequestInterceptor:public virtual Interceptor { public: virtual void receive_request_service_contexts (ServerRequestInfo_ptr _ri)=0; virtual void receive_request(ServerRequestInfo_ptr _ri)=0; virtual void send_reply(ServerRequestInfo_ptr _ri)=0; virtual void send_exception(ServerRequestInfo_ptr _ri)=0; virtual void send_other(ServerRequestInfo_ptr _ri)=0; };
- コードサンプル19-6 ServerRequestInterceptorインタフェース(Java)
package org.omg.PortableInterceptor; public interface ServerRequestInterceptor extends Interceptor,org.omg.CORBA.portable.IDLEntity, org.omg.CORBA.LocalInterface { public void receive_request_service_contexts (ServerRequestInfo ri)throws ForwardRequest; public void receive_request(ServerRequestInfo ri) throws ForwardRequest; public void send_reply(ServerRequestInfo ri); public void send_exception(ServerRequestInfo ri) throws ForwardRequest; public void send_other(ServerRequestInfo ri)throws ForwardRequest; }
サーバ側の規則を次に,具体例を表19-4に示します。
-
開始インタセプトポイントはreceive_request_service_contextsです。どのリクエスト/応答シーケンスでも,このインタセプトポイントが呼び出されます。
-
終了インタセプトポイントはsend_reply,send_exception,およびsend_otherです。どのリクエスト/応答シーケンスでも,このインタセプトポイントのどれか一つだけが呼び出されます。
-
中間インタセプトポイントはreceive_requestです。これは,receive_request_service_contextsのあと,終了インタセプトポイントの前に呼び出されます。
-
例外では,receive_requestは呼び出されないことがあります。
-
終了インタセプトポイントは,send_requestまたはsend_pollのどちらかの実行が成功した場合だけ呼び出されます。
-
send_exceptionは,ORBのシャットダウンによってリクエストがキャンセルされて,マイナーコード4(ORBのシャットダウン)のシステム例外BAD_INV_ORDERが発生すると呼び出されます。
-
send_exceptionは,リクエストがそのほかの理由によってキャンセルされて,マイナーコード3のシステム例外TRANSIENTが発生すると呼び出されます。
表19‒4 サーバ側の規則の具体例 サーバ側の規則
説明
呼び出し成功
インタセプトポイントの順序receive_request_service_contexts,receive_request,send_reply。開始点,中間点,終了点の順。