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

Junichi Kato [E-MAIL ADDRESS DELETED]
2009年 7月 28日 (火) 17:40:01 JST


金成さん
加藤です。

あ、すみません。クラスの実装がDIコンテナを意識した構成になっていませんでした。。。orz
多分、こんなクラスです。

public abstract class AbstractPausableTask<T> {

	private T pauseObject;
	
	private AtomicBoolean pause;
	
	private final AtomicBoolean paused = new AtomicBoolean();

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

	/**
	* 一時停止用オブジェクトを設定します。
	*
	* @param pauseObject
	*            一時停止用オブジェクト
	*/
	public void setPauseObject(T pauseObject){
		this.pauseObject = pauseObject;
	}


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

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

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

	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);
	                                   }
	                           }
	                   }
	           }
	   }
	}
}

実際動かしていないので、試してほしいのですが、
タスクの方はこういうのでいかがでしょうか?

@Task
public class BTask extends AbstractPausableTask<ATask>{

	public void Execute(){
		while(true){
			waitProcess();
			// なんかの処理
		}
	}

}

@Task
public class ATask {

	public BTask bTask;
	
	private AtomicBoolean pause;
	
	public void initialize(){
		bTask.setPauseObject(this);
		bTask.setPause(pause);
	}
	
	// ATaskが実行されるたびにBTaskの一時停止・再開が切り替えられる
	public void Execute(){
		pause.set( ! pause.get() );
		this.notify();
	}

}

よろしくお願いします。

2009/07/28 10:11 に kanari takuma<[E-MAIL ADDRESS DELETED]> さんは書きました:
> 金成です。
> 昨日ご指摘頂いた、
> AbstractPausableTaskを用いた実装方法に関して、数点確認があります。
>>>タスクBはAbstractPausableTaskを継承する。
> この場合、タスクBは@Taskで管理するタスクとしての実装ではなくなるのでしょうか(引数ありのコンストラクタをタスククラスで設定した場合、s2chronos側でエラーとなる)。
>
>>>タスクAにあるpauseObjectとpauseをタスクBに設定する。
> pauseObjectとpuaseの概念を、明確に掴むことが出来なかったのですが、
> 私の理解不足であることは承知しておりますが、
> 具体的に説明して頂けないでしょうか。
> お手数お掛け致しますが、宜しくお願い致します。
>
>
> 2009/07/27 18:32 Junichi Kato <[E-MAIL ADDRESS DELETED]>:
>>
>> 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 mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-user
>
>
> _______________________________________________
> 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 メーリングリストの案内