调度一段代码,在Play 2.4.2中的Akka actor内每隔几秒运行一次

时间:2015-07-21 23:01:58

标签: java playframework-2.0 akka

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

有没有办法安排一个方法在一个演员的间隔内运行?大多数文档仅显示如何为不同的actor安排任务,如下所示:

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()
);

这可能吗?

1 个答案:

答案 0 :(得分:1)

是的,这当然是可能的。我喜欢的方法是让actor向自己发送消息,并在Receive中调用你想要执行的方法。例如(在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继续执行一次完成一项任务,保持线程在演员中的安全。