我有一个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()
);
这可能吗?
答案 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继续执行一次完成一项任务,保持线程在演员中的安全。