4

スケジューラで 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 になっていることがわかったら、正常にシャットダウンします。

これを適切に行う方法はありますか (現在の反復を完了してからシャットダウンします)。

4

1 に答える 1

6

stopAndWait() を呼び出すだけではありませんか?

Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            service.stopAsync().awaitTerminated(60, TimeUnit.SECONDS);
        }
});
于 2012-08-31T13:13:56.747 に答える