タスク(ジョブをタスクに改名しました)に以下のsetter/getterを配置することで,トリガーの機能を実現することにしました.
getStartTaskでtrueを返すとスケジューラから当該タスクが起動され,逆にgetEndTaskでtrueを返すと終了します.
getShutdownTaskの場合は,スケジューラがタスクのスレッドに対してインタラプトを実行し即座にキャンセルを行います.
タスクのメソッド内のAPIでブロッキングしている場合はこの方法でタスクを終了させます.
これだけだと,時間の判定処理を自前で実装しないといけないので,いくつか標準的なトリガーをDIできるようにしようと思っています.
DIされたトリガーは,タスクのinitializeメソッドでトリガーに対して起動時刻などを設定し,getterでスケジューラに返します.
仕様的にはこんな感じです.
private boolean executed = false; public void setExecuted(boolean executed) { this.executed = executed; } public boolean isExecuted() { return executed; } private boolean startTask; // 実行したらfalseにします. public void setStartTask(boolean startTask) { this.startTask = startTask; } // trueを返すとスケジューラから起動されます public boolean getStartTask() { return this.startTask; } private boolean endTask; // 停止したらfalseにします. public void setEndTask(boolean endTask) { this.endTask = endTask; } // trueを返すとスケジューラから停止されます. public boolean getEndTask() { return endTask; } private boolean shutdownTask; // シャットダウンしたらfalseにします. public void setShutdownTask(boolean shutdownTask) { this.shutdownTask = shutdownTask; } // trueを返すとスケジューラからシャットダウンされます. public boolean getShutdownTask() { return this.shutdownTask; }