ページの先頭行へ戻る
 Apcoordinatorユーザーズガイド

4.4 ビジネスクラス呼び出しのフック

ビジネスクラスが呼び出される前にユーザ定義のクラスを呼び出し、そのクラスからビジネスクラスの呼び出しを制御することができます。例えば、ビジネスクラス実行前後でのログの取得や、ビジネスクラスでエラーが発生した場合のリトライ制御に利用できます。

通常はアプリケーションクラス、セションクラス、ビジネスクラスのメソッドが次の順番で呼び出されます。

  1. アプリケーションクラスのpreprocess

  2. セションクラスのpreprocess

  3. ビジネスクラスのpreprocess

  4. ビジネスクラスのメソッド(コマンドマップで指定されたもの)

  5. ビジネスクラスのpostprocessまたはhandleException

  6. セションクラスのpostprocessまたはhandleException

  7. アプリケーションクラスのpostprocessまたはhandleException

ただし、preprocessが呼ばれるのはPreprocessorインタフェースを実装している場合であり、postprocessとhandleExceptionが呼ばれるのはPostprocessorインタフェースを実装している場合です。

ビジネスクラスのフック機能を使うと、上記3,4,5でユーザ定義のクラスを呼び出せます。このユーザ定義のクラスをフッククラスと呼びます。フッククラスを使って次のような呼び出し順にできます。

  1. アプリケーションクラスのpreprocess

  2. セションクラスのpreprocess

  3. フッククラスのpreprocess

  4. フッククラスのdispatch

  5. ビジネスクラスのpreprocess

  6. ビジネスクラスのメソッド(コマンドマップで指定されたもの)

  7. ビジネスクラスのpostprocessまたはhandleException

  8. フッククラスのpostprocessまたはhandleException

  9. セションクラスのpostprocessまたはhandleException

  10. アプリケーションクラスのpostprocessまたはhandleException

フッククラスがPreprocessorインタフェースを実装している場合には、そのpreprocessが呼ばれます。また、Postprocessorインタフェースを実装していればpostprocessとhandleExceptionが呼ばれます。Preprocessor, Postprocessorインタフェースについては“4.1 共通処理”を参照してください。

フッククラスのdispatchメソッドでは、上記の呼び出し順で示したように、ビジネスクラスのpreprocess、コマンドマップ指定のメソッド、ビジネスクラスのpostprocessまたはhandleExceptionをこの順に呼び出すことができます。フッククラスはHandlerHookクラスを継承して作成します。

import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.ThreadSafeDispatchHandler;
import com.fujitsu.uji.DispatchException;

public class MyHook extends com.fujitsu.uji.HandlerHook {
        public MyHook() {
                // 以下に初期化する手続きを記述してください。
        }

        public Object dispatch(DispatchContext ctx,
                        ThreadSafeDispatchHandler dispatchHandler) 
                        throws DispatchException {

                System.out.println("MyHook: dispatch()");

                // 2回リトライします。
                DispatchException lastEx=null;
                for (int i=0; i<3; i++) {
                        System.out.println("MyHook: try "+i);
                        try {
                                return dispatchHandler.dispatchSafely(ctx);
                        }
                        catch (DispatchException e) {
                                e.printStackTrace();
                                lastEx=e;
                        }
                }
                throw new DispatchException("Failed 3 times",lastEx);
        }

dispatchメソッドにはThreadSafeDispathHandlerが渡されます。このクラスのdispatchSafelyメソッドを呼び出すと、ビジネスクラスのpreprocessメソッド, コマンドマップで指定したメソッド, postprocessメソッドが呼び出されます。dispatchSafelyメソッドの引数にはdispatchメソッドの引数として渡されたDispatchContextを与えてください。

作成したフッククラスを有効にするには、ファクトリクラスのnewHandlerHookメソッドをオーバーライドし、フッククラスのオブジェクトを新規作成して返すようにします。以下は、Webアプリケーションのファクトリクラスを使用した例です。

import com.fujitsu.uji.http.HttpFactory;
import com.fujitsu.uji.HandlerHook;

public class HookFactory extends HttpFactory {

        // 作成したフッククラスをnewして返すようにします。
        public HandlerHook newHandlerHook() {
                return new MyHook();
        }
}

なお、ユーザ定義のファクトリクラスを作成した場合は、初期化パラメタの設定が必要です。ファクトリクラスの使用方法の詳細については、“3.5 ファクトリクラス”を参照してください。