java - 在 Play 2.4.2 中安排一段代码在 Akka actor 内每隔几秒运行一次

标签 java playframework-2.0 akka

我有一个角色类,Manager extends UntypedActor,其中包含消息列表:listOfMessages、客户端 WebSocket 连接列表:clientConnections ,以及一个方法 sendMessagesToClient,该方法将 listOfMessages 中的每条消息发送给每个客户端,然后将 listOfMessages 重置为空列表。我希望每 2 秒执行一次 sendMessagesToClient 方法。

有没有办法安排一个方法在参与者内部按一定时间间隔运行?大多数文档仅展示如何为不同的参与者安排任务,如下所示:

system.scheduler().schedule(
    Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 0 milliseconds
    Duration.create(30, TimeUnit.MINUTES),     //Frequency 30 minutes
    testActor,
    "tick",
    system.dispatcher(),
    null
);

但我想在 Manager 类中实现类似的内容:

system.scheduler().schedule(
    Duration.create(0, MILLISECONDS),
    Durant.create(2, "seconds"),
    sendMessagesToClient()
);

这可能吗?

最佳答案

是的,这当然是可能的。我更喜欢的方法是让参与者向自身发送消息,并在接收中调用您想要执行的方法。例如(在 Scala 中,因为它是我使用 Akka 的方式):

class Example extends Actor {

  override def preStart() {
    system.scheduler().schedule(
     Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 0 milliseconds
     Duration.create(30, TimeUnit.MINUTES),     //Frequency 30 minutes
     self, //Send the message to itself
     "tick",
     system.dispatcher(),
     null
   );
  }

  def receive = {
   case "tick" => sendMessagesToClient()
  }

  def sendMessagesToClient() {
    //do work
  }
}

一旦开始,该参与者就会安排定期向自己发送消息“tick”。

我认为以这种方式处理调度的优点之一是它将“tick”完成的工作与 Actor 完成的任何其他工作一起排队,因此它有助于确保 Actor 仅继续执行一次执行一项任务,保持 Actor 内的线程安全。

关于java - 在 Play 2.4.2 中安排一段代码在 Akka actor 内每隔几秒运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31551104/

相关文章:

java - 使用 HttpURLConnection 发送二进制数据

java - 无法使用 memcached 正确检索列名

javascript - Play 2.0 - JavaScript 资源中的闭包编译器内部错误

scala - Akka持久性查询事件流和CQRS

java - 如何检测 akka actor 终止是由于系统关闭造成的并避免重新启动它

java - Java RMI 的 C++ 客户端?或从 C++ 使用 Java 的任何其他方式?

java - 想念什么,连接 Firestore 和 ListView 以获得样本中的随机结果?

scala - Play Framework Ning WS API 编码问题与 HTML 页面

scala - 如何在 scala Play 中执行启动代码!框架应用?

用于分布式计算的 Java 8 MapReduce