スケジューラで AbstractScheduledService を使用しています。次のような単純なパターン:
class MyService extends AbstractScheduledService {
// KEEP THIS VAR IN MIND W.R.T the SHUTDOWN_HOOK BELOW
public static volatile boolean keepRunning = true;
protected void startUp() throws Exception {
// startup stuff
}
protected void runOneIteration() throws Exception {
// main logic stuff
}
protected void shutDown() throws Exception {
// shutdown stuff
}
protected Scheduler scheduler() {
return Scheduler.newFixedRateSchedule(0, 1, TimeUnit.SECONDS);
}
}
ここで、次のような典型的なシャットダウン フックを実装したいと思います: (以下のスニペットはメイン メソッドになります)
final Thread mainThread = Thread.currentThread();
LOGGER.debug("Adding the shutdown hook");
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
keepRunning = false;
LOGGER.debug("The shutdown hook was engaged. Setting keepRunnning to false.");
try {
// Is this appropriate?
mainThread.join();
} catch (InterruptedException e) {
// handle exception here
}
}
});
シャットダウン フックは、典型的なドキュメントの例からのものです。サービス自体が別のスレッドで実行されているため、Guava サービス パターンではうまく機能しないようです。
私のサービスには、runOneIteration() ロジックにポーリング ループがあります。目前の現在のタスクを完了してから、現在の反復でビジーだった最近の時間に Shutdown フックが使用されたため、keepRunning が false になっていることがわかったら、正常にシャットダウンします。
これを適切に行う方法はありますか (現在の反復を完了してからシャットダウンします)。