[Seasar-user:18069] Re: [S2Chronos]タスクの一時停止

Junichi Kato [E-MAIL ADDRESS DELETED]
2009年 7月 27日 (月) 18:32:21 JST


kanari takumaさん
加藤(j5ik2o)です。

S2Chronosのご利用ありがとうございます。

さて、本題ですが、現行版のS2Chronosではスケジューラでの一時停止は可能ですが、タスククラス単位での一時停止をサポートしていません。

ここからはご参考までに実装方法を書かせていただきます。

org.seasar.chronos.core.processor.impl.ScheduleExecuteWaitProcessorクラスを参考にして、このdoProcessと同等の処理を一時停止させたいタスク内に実装すれば可能ではないかと思います。

以下のコードはちょっと書いてみたいのですが、実際に動かしてないので、チョー適当なんであてにしないでくださいw

waitProcessメソッドをタスククラスの処理中で定期的に呼び出すようにしておいて、
pause.set(true)とすると一時停止、pause.set(false)とすると再開すると思います。
後、pauseObject.notify()するのを忘れないようにしてください。

なので、タスクBはAbstractPausableTaskを継承する。
その際にタスクAにあるpauseObjectとpauseをタスクBに設定する。
タスクAで
pause.set( ! pause.get() );
pauseObject.notify();
でタスクBの一時停止や再開ができると思います。

ご参考までに。

public abstract class AbstractPausableTask<T> {
	/**
	 * コンストラクタです。
	 *
	 * @param pauseOjbect
	 *            一時停止用オブジェクト
	 * @param pause
	 *            一時停止命令フラグ
	 */
	protected PausableTask(T pauseOjbect, AtomicBoolean pause) {
		this.pauseOjbect = pauseOjbect;
	}

	private final T pauseOjbect;

	/**
	 * 一時停止用オブジェクトを返します。
	 *
	 * @return 一時停止用オブジェクト
	 */
	public T getPauseOjbect() {
		return pauseOjbect;
	}

	private AtomicBoolean pause;

	/**
	 * 一時停止命令フラグを返します。
	 *
	 * @return 一時停止命令フラグ
	 */
	public AtomicBoolean getPause() {
		return pause;
	}

	/**
	 * 一時停止命令用フラグを設定します。
	 *
	 * @param pause
	 *            一時停止命令用フラグ
	 */
	public void setPause(AtomicBoolean pause) {
		this.pause = pause;
	}

	/**
	 * 一時停止状態かどうかを返します。
	 *
	 * @return 一時停止状態の場合true
	 */
	public AtomicBoolean getPaused() {
		return paused;
	}

	private final AtomicBoolean paused = new AtomicBoolean();

	protected void waitProcess() {
		if (pause.get()) {
			synchronized (pauseOjbect) {
				try {
					do {
						if (this.paused != null) {
							// 一時停止命令があり一時停止中でなければ
							if (!paused.get() && pause.get()) {
								// 状態フラグを一時停止中にする
								this.paused.set(true);
							}
						}
						pauseOjbect.wait(500L);
					} while (pause.get());
				} catch (InterruptedException e) {
					throw new RuntimeException(e);
				} finally {
					if (paused != null) {
						if (paused.get()) {
							paused.set(false);
						}
					}
				}
			}
		}
	}
}





2009/07/27 16:52 に kanari takuma<[E-MAIL ADDRESS DELETED]> さんは書きました:
> 初めて質問させていただきます。金成と申します。
> お世話になります。
> S2Chronosでのバッチ処理に関して質問があります。
> 定時処理タスクA(CRONトリガにて呼び出し)と、
> 不定期タスクBが混在するWebアプリケーション内のバッチ処理を製造しています。
> (不定期タスクBは、正確にはバッチ処理ではなく、リクエスト契機で実行される処理ですが、
> 処理時間がかかるため、S2Chronosのタスククラスと、独自実装のトリガクラスを利用し、リクエストでトリガしています。)
> 現在、不定期タスクB実行中に、定時タスクAが実行された場合、
> タスクBを一時停止し、タスクAの処理終了後、タスクBを再開させる(wait, sleepのようなイメージ)処理が可能かどうか検討しているのですが、
> タスクを一時停止し、再開可能な状態を保持するという処理は、S2Chronosで可能なのでしょうか。
> 使用しているS2Chronosのバージョンは以下の通りです。
> s2chronos-core ・・・ 1.0.0
> s2chronos-extension ・・・ 1.0.0
> お手数お掛けいたしますが、ご回答宜しくお願い致します。
>
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
>



-- 
/**
 * name  : Junichi Kato
 * email : [E-MAIL ADDRESS DELETED]
 *
 * blog  : http://d.hatena.ne.jp/j5ik2o/
 *
 * commiting projects :
 * http://jiemamy.org/
 * http://s2chronos.sandbox.seasar.org/
 * http://s2config.sandbox.seasar.org/
 */


Seasar-user メーリングリストの案内