我现在每秒都向Akka演员发送一条消息,要求它执行任务。
如果演员收到新消息时该任务(函数)仍在运行,我希望演员什么都不做。基本上,我希望actor函数只在它尚未运行时运行。
这样做的好方法是什么?我应该使用Akka演员还是以其他方式进行演绎?
干杯
答案 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需求很高,您可以考虑将您的演员移到单独的调度员身上。