避免同时执行Akka actor

时间:2013-10-17 15:10:07

标签: scala akka actor

我现在每秒都向Akka演员发送一条消息,要求它执行任务。

如果演员收到新消息时该任务(函数)仍在运行,我希望演员什么都不做。基本上,我希望actor函数只在它尚未运行时运行。

这样做的好方法是什么?我应该使用Akka演员还是以其他方式进行演绎?

干杯

2 个答案:

答案 0 :(得分:1)

Actors一次处理一条消息。你描述的情况不可能发生。

答案 1 :(得分:0)

Akka actor逐个异步处理他们的消息,因此您只能删除/忽略“过期”消息以避免由于actor的邮箱溢出而导致的额外处理和OutOfMemoryException-s。

您可以忽略actor内的过期消息(在您的情况下超过1秒):

case class DoWork(createdTime: Long = System.currentTimeMillis)

final val messageTimeout = 1000L // one second

def receive = {
  case DoWork(createdTime) =>
    if((System.currentTimeMillis - createdTime) < messageTimeout) { doWork() }    
}

或者您可以创建一个可以在内部删除过期邮件的自定义邮箱。

当然,正如Robin Green已经提到的,一般来说演员不应该在内部运行长时间运行的操作,所以这种方法只有在你的演员不需要处理其他类型的消息时才适用(他们不会及时处理)。如果CPU需求很高,您可以考虑将您的演员移到单独的调度员身上。