Seasar2のSMART Deployに対応したタスクスケジューリングライブラリらしい。前にS2Quartzというのがあったような気がしたのだが、アレがS2Chronosになったのだろうか?事情は知らん。
で、SAStrutsとかTeedaみたいなWebアプリの中で動かす方法がマニュアルに書いてないので適当にいじってみた。
どうやら、chronos-core.dicon を app.dicon で include して、スケジューラ起動のためにorg.seasar.chronos.extension.servlet.S2ChronosServlet をweb.xmlに追加してサーブレットを起動させてやればいいらしい。
以下のようなクラスを作って…
@Component(instance=InstanceType.APPLICATION) public class CounterDto implements Serializable{ public int count; public String toString() { return Integer.toString(this.count); } }
@Task @CronTrigger(expression = "*/30 * * * * ?") public class IntervalTask { public CounterDto counterDto; public void initialize() { this.counterDto.count++; System.out.println(counterDto); } }
Tomcatを起動するとEclipseのコンソールに30秒おきに数字が書き出される。@CronTriggerがクロノトリガーに見えるとかは別にどうでもいい。
んでSAStrutsで…
public class IndexAction { public CounterDto counterDto; public HttpServletResponse response; @Execute(validator=false) public String index() throws IOException { PrintWriter w = this.response.getWriter(); w.print(counterDto); return null; } }
というアクションを作って現在のカウントをWebブラウザで確認、とか思ったのだが、HOT Deployではカウントアップした値が表示されずに初回アクセス時の数字がずっと表示されてしまう。COOL Deployなら問題なくS2ChronosでカウントアップしたDTOの値が取れた。というわけで、まだHOT Deploy完全対応ではないらしい。
Javaでスケジューリングしたい場面もあるけど、cronに頼るのはJavaとしては負け感だし、TimerTaskとか面倒くさいし、まだversionは0.0.1-RC3というわけで今後のバージョンアプに期待アゲ。