2017-07-04 11 views
0

私はこのスケジューラを使用しています。それが5になったら、それを一時停止し、その後番号triesをリセットしたいと思います。私はtotalTriesが5に達した点に達してから、30秒間停止します。しかし、30秒を過ぎるとすぐに次の5つのログが記録されます。totalTriesと再び一時停止します。明らかに、何かがカーテンの後ろで起こっている。Java - Akkaスケジューラを一時停止

これはどのように誤解されていますか?私がやりたいことは、その期間、ActorSystem systemを完全に一時停止することです。どんなヒントも大変感謝しています。

system.scheduler().schedule(
    Duration.create(5, TimeUnit.SECONDS), 
    Duration.create(1, TimeUnit.SECONDS), 
    new Runnable() {    

     public void run() { 

       int totalTries = incrementTries(1); 
       logger.info("tries: " + totalTries); 

       if(totalTries >= 5) { 
        logger.info("5 tries reached, waiting 30 seconds.");         
        try {    
         Thread.sleep(30000); 
        } catch (InterruptedException e) { 
         logger.info("Sleep interrupted" + e); 
        } 
        resetTries(); 
       }       
      } 
     } 
    }, system.dispatcher()); 

答えて

2

私が知る限り、ActorSystemを一時停止することはできません。あなたのコードはThread.sleep(30000)を呼び出すことによってスケジューラースレッドをブロックしています。起床すると、保留中の通知を発行してスケジュールに追いつこうとします。これは正しい動作です。

アクターシステムのスレッドをブロックするためにThread.sleepを使用することはお勧めしません。

私は何をしたいことは次のとおりです。

あなたのカウンターが5に達すると:

  • スケジュールしますハンドラと30秒でスケジュール
  • スケジュールに新しい一回限りの通知をキャンセル元の通知を全部もう一度

また、元のスケジュールを維持して、カウンタが5に達すると、

  • はさらに、通知を
  • スケジュール上記ステップ
に設定されたフラグの設定を解除しますハンドラと30秒に新しいオフ通知を無視するようにフラグを設定します
関連する問題