我有一个角色类,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/