19.2.2 リクエストインタセプタ

リクエストインタセプタは,特定のインタセプトポイントでリクエスト/応答シーケンスのフローを受け取るために使用します。これによってサービスはクライアントとサーバ間でコンテキスト情報を転送できます。各インタセプトポイントではBorland Enterprise Server VisiBroker ORBはオブジェクトを与えて,このオブジェクトによってインタセプタはリクエスト情報にアクセスできます。リクエストインタセプタには2種類あり,そのそれぞれにリクエスト情報インタフェースがあります。

リクエストのインタセプタポイントを図19-2に示します。

図19-2 リクエストのインタセプタポイント

[図データ]

リクエストインタセプタの詳細については,マニュアル「Borland Enterprise Server VisiBroker プログラマーズリファレンス」の「ポータブルインタセプタインタフェースとクラス」の記述を参照してください。

<この項の構成>
(1) ClientRequestInterceptor
(2) ServerRequestInterceptor

(1) ClientRequestInterceptor

ClientRequestInterceptorには,クライアント側でインプリメントされたインタセプトポイントがあります。

表19-1に示すように,OMGがClientRequestInterceptorで定義しているインタセプトポイントは五つあります。

表19-1 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に示します。

(2) ServerRequestInterceptor

ServerRequestInterceptorには,サーバ側でインプリメントされたインタセプトポイントがあります。表19-3に示すように,OMGがServerRequestInterceptorで定義しているインタセプトポイントは五つあります。

表19-3 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に示します。