All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nablarch.fw.invoker.AsyncHandlerListInvoker Maven / Gradle / Ivy

package nablarch.fw.invoker;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;

import nablarch.core.util.annotation.Published;
import nablarch.fw.ExecutionContext;

/**
 * 非同期でハンドラリストの起動を行う{@link HandlerListInvoker}の実装クラス。
 *
 * @author T.Kawasaki
 * @param     処理対象データ型
 * @param   処理結果データ型
 */
public class AsyncHandlerListInvoker implements HandlerListInvoker> {

    /** {@link HandlerListInvoker}インスタンス */
    private HandlerListInvoker handlerListInvoker;

    /** Nablarchのハンドラリストを実行するためのスレッドを生成する{@link ExecutorServiceFactory} */
    private ExecutorServiceFactory executorServiceFactory;

    /**
     * {@code AsyncHandlerListInvoker}を生成する。
     */
    @Published(tag = "architect")
    public AsyncHandlerListInvoker() {
    }

    @Override
    public Future invokeHandlerList(TData input, ExecutionContext context) {
        Callable caller = createCallable(getHandlerListInvoker(), input, context);
        ExecutorService service = getExecutorService();
        return service.submit(caller);
    }

    /**
     * ハンドラリストを起動する{@link Callable}インスタンスを生成する。
     * ハンドラリストの起動方法を変更したい場合や、起動前後に処理を追加したい場合、
     * 本メソッドをオーバーライドしてよい。
     *
     * @param handlerListInvoker {@link HandlerListInvoker}
     * @param input 入力データ
     * @param context {@link ExecutionContext}
     * @return {@link Callable}インスタンス
     */
    @Published(tag = "architect")
    protected Callable createCallable(
            final HandlerListInvoker handlerListInvoker,
            final TData input,
            final ExecutionContext context) {

        return new Callable() {
            @Override
            public TResult call() throws Exception {
                return handlerListInvoker.invokeHandlerList(input, context);
            }
        };
    }

    /**
     * {@link HandlerListInvoker}を取得する。
     *
     * @return {@link HandlerListInvoker}インスタンス
     */
    private HandlerListInvoker getHandlerListInvoker() {
        if (handlerListInvoker == null) {
            throw new IllegalStateException("handlerListInvoker must be set.");
        }
        return handlerListInvoker;
    }

    /**
     * {@link ExecutorServiceFactory}インスタンスを取得する。
     *
     * @return {@link ExecutorServiceFactory}インスタンス
     */
    private ExecutorService getExecutorService() {
        if (executorServiceFactory == null) {
            throw new IllegalStateException("executorServiceFactory must be set.");
        }
        return executorServiceFactory.getExecutorService();
    }

    /**
     * {@link HandlerListInvoker}を設定する。
     * ここで設定された{@link HandlerListInvoker}を使用して、
     * ハンドラリストを起動する。
     *
     * @param handlerListInvoker {@link HandlerListInvoker}インスタンス
     */
    public void setHandlerListInvoker(
            HandlerListInvoker handlerListInvoker) {
        this.handlerListInvoker = handlerListInvoker;
    }

    /**
     * {@link ExecutorServiceFactory}を設定する。
     * ここで設定されたファクトリから、{@link ExecutorService}を取得して、
     * ハンドラリストを起動する。
     *
     * @param executorServiceFactory {@link ExecutorServiceFactory}
     */
    public void setExecutorServiceFactory(ExecutorServiceFactory executorServiceFactory) {
        this.executorServiceFactory = executorServiceFactory;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy