所以我有这个调度程序,它现在除了增加一个数字之外没有做任何事情。当它达到 5 时,我想暂停它,然后重置尝试次数。我到达了 totalTries
达到 5 的点,然后它停止了 30 秒。但 30 秒过去后,它会立即记录下 5 个 totalTries
并再次暂停。显然,幕后正在发生更多事情。
我是否误解了它的使用方式?我想要做的是完全暂停 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());
最佳答案
据我所知,您无法暂停 ActorSystem。您的代码通过调用 Thread.sleep(30000) 执行的操作会阻塞调度程序线程,当它醒来时,它会尝试通过发出挂起的通知来 catch 其计划 - 这是正确的行为。
不建议使用 Thread.sleep 来阻塞 Actor 系统中的线程。
我要做的是:
当你的计数器达到 5 时:
- 取消日程
- 使用处理程序在 30 秒内安排一个新的一次性通知,该处理程序将重新安排原始通知
或者,您可以继续原来的时间表,一旦计数器达到 5:
- 设置一个标志以忽略进一步的通知
- 使用处理程序在 30 秒内安排一个新的一次性通知,该处理程序将取消在上述步骤中设置的标志
关于Java - 暂停 Akka 调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44904779/