Java - 暂停 Akka 调度程序

标签 java akka

所以我有这个调度程序,它现在除了增加一个数字之外没有做任何事情。当它达到 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/

相关文章:

java - 如何配置 Eclipse Web 浏览器/网络设置?

json - 使用 AKKA Stream 解码分块 JSON

java - Patterns.ask 超时后消息将转到哪里?

multithreading - 在实践中在哪里以及如何使用 Actor

java - 为什么我的 ArrayList 包含添加到列表中的最后一项的 N 个副本?

java - 从批处理文件发出运行 java 程序,在 IDE 中运行良好

java - 创建自定义 Flowable 任务

java - 底部导航 View

multithreading - Akka 中使用 Actor 模型的读写器锁

java - Deeplearning4j 在 Scala 中的线程间共享计算图