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

nablarch.fw.handler.DuplicateProcessCheckHandler Maven / Gradle / Ivy

There is a newer version: 2.0.0
Show newest version
package nablarch.fw.handler;

import nablarch.core.ThreadContext;
import nablarch.core.log.Logger;
import nablarch.core.log.LoggerManager;
import nablarch.core.util.annotation.Published;
import nablarch.fw.ExecutionContext;
import nablarch.fw.Handler;

/**
 * プロセスの2重起動をチェックするハンドラ。
 * 

*

* プロセスの2重起動チェックは、{@link DuplicateProcessChecker}にて行う。 * * @author hisaaki sioiri */ public class DuplicateProcessCheckHandler implements Handler { /** 終了コード */ private int exitCode = 500; /** プロセス2重起動チェックを行うクラス */ private DuplicateProcessChecker duplicateProcessChecker; /** ロガー */ private static final Logger LOGGER = LoggerManager.get(DuplicateProcessCheckHandler.class); /** * {@inheritDoc} *

* プロセス(リクエスト)が2重起動でないことをチェックする。 * 2重起動の場合には、例外を送出し処理を終了する。 */ public Object handle(Object o, ExecutionContext context) { try { duplicateProcessChecker.checkAndActive(ThreadContext.getRequestId()); } catch (AlreadyProcessRunningException ignored) { throw new DuplicateProcess(exitCode); } Throwable originalError = null; try { return context.handleNext(o); } catch (RuntimeException e) { originalError = e; throw e; } catch (Error e) { originalError = e; throw e; } finally { inactive(originalError != null); } } /** * プロセスの非アクティブ化を行う。 * * 非アクティブ化処理中に例外が発生し、かつ呼び出し元で例外が発生していない場合 * {@link RuntimeException}を送出する。 * * @param throwException 呼び出し元で例外が発生しているか否か */ private void inactive(final boolean throwException) { try { duplicateProcessChecker.inactive(ThreadContext.getRequestId()); } catch (Throwable t) { LOGGER.logWarn("failed to disable process.", t); if (!throwException) { throw new RuntimeException(t); } } } /** * 終了コードを設定する。 * * @param exitCode 終了コード */ public void setExitCode(int exitCode) { if (exitCode <= 0 || exitCode >= 256) { throw new IllegalArgumentException("exit code was invalid range. " + "Please set it in the range of 255 from 1. " + "specified value was:" + exitCode); } this.exitCode = exitCode; } /** * プロセス2重起動チェックを行うクラスを設定する。 * * @param duplicateProcessChecker プロセス2重起動チェックを行うクラス。 */ public void setDuplicateProcessChecker(DuplicateProcessChecker duplicateProcessChecker) { this.duplicateProcessChecker = duplicateProcessChecker; } /** プロセスが2重に起動された場合に送出される例外クラス。 */ @Published(tag = "architect") public static class DuplicateProcess extends nablarch.fw.results.InternalError { /** 終了コード */ private int exitCode; /** * 2重起動を示す例外を生成する。 * * @param exitCode 終了コード */ public DuplicateProcess(int exitCode) { super("specified request_id is already used by another process. " + "you can not start two or more processes with same request_id."); this.exitCode = exitCode; } @Override public int getStatusCode() { return exitCode; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy