0

我目前正在每秒向 Akka 演员发送一条消息,以便它执行一项任务。

如果演员收到新消息时该任务(功能)仍在运行,我希望演员什么都不做。基本上,我希望仅在尚未运行的情况下运行演员功能。

有什么好方法可以做到这一点?我应该使用 Akka 演员还是另一种方式?

干杯

4

2 回答 2

1

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

于 2013-10-17T16:15:13.343 回答
0

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

您可以忽略演员内部的过期(在您的情况下超过 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 已经提到的,一般而言,actor 不应该在内部运行长时间运行的操作,因此这种方法仅适用于您的 actor 不需要处理其他类型的消息(它们不会被及时处理) )。如果 CPU 需求很高,您可以考虑将您的演员移动到单独的调度程序上。

于 2013-10-17T15:44:46.910 回答