我目前正在每秒向 Akka 演员发送一条消息,以便它执行一项任务。
如果演员收到新消息时该任务(功能)仍在运行,我希望演员什么都不做。基本上,我希望仅在尚未运行的情况下运行演员功能。
有什么好方法可以做到这一点?我应该使用 Akka 演员还是另一种方式?
干杯
Actor 一次处理一条消息。你描述的情况不可能发生。
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 需求很高,您可以考虑将您的演员移动到单独的调度程序上。