月例のJava読書会の日。今日も、アジャイルソフトウェア開発の奥義です。だんだん残りも減ってきて、あと2回で終わりそうかな、という進捗でした。
今日の読書会で盛り上がった話題は、
- サマータイム問題
- 時刻同期(精度)問題
です。
(書籍内容から関連で議論が発展(発散?))
タイマー(cron)関係
Javaでは、java.util.TimerクラスがJDK1.3から導入され、一定間隔でタスクを実行するという用途に便利な機能が提供されています。このTimerクラスはシングルスレッド・モデルなので、Timerから起動されるタスクが長時間スレッドを占拠してしまうと、次のタスクの発動が遅延される可能性があります。
JDK1.5で導入されたjava.util.concurrentパッケージには、Timerに近い機能としてScheduledExecutorServiceインタフェースが用意されており、実装として複数スレッドをプーリングし、タスクをそれぞれ別スレッドで発動するScheduledThreadPoolExecutorクラスが提供されています。これを使用すると、java.util.Timerで述べたスレッド占拠問題がある程度回避されます。
上記の2つはいずれも一定間隔(相対時刻)でタスクを起動するので、UNIXのcronのようにカレンダーに基づいてタスクを起動する仕組みを実現するには一工夫が必要です。
IBMのdeveloperWorksに、IBM Developer 日本語版 : 大変申し訳ありません。このページは無効です。
という記事が公開されており、java.util.Timerをベースにcronのような機能を提供するフレームワークが解説&ソース提供されています。