所有问题均以问题“Scala, Actors, what happens to unread inbox messages?”开头。我正在考虑如何在很多演员的大型系统中避免这些问题。
我发现自己写的是这样的:
react {
//all cases
case any: AnyRef => logMessageWithoutCase(any)
}
是否可以避免内存泄漏或是否有一些副作用?
UPDATE 1 感谢@Alexey Romanov和@Luigi Plinge,如果在系统中会有一些垃圾邮件演员吗?
这样的事情:
react{
//all cases
case msg: Any => Spam!msg
}
最后在垃圾邮件中会记录或保存到数据库。我认为,这是更直观的解决方案。
答案 0 :(得分:2)
记录消息是的副作用:)由于日志记录可能需要写入磁盘或数据库,如果您有许多不匹配的消息,这可能会降低性能。否则是的,这是避免内存泄漏的好方法。
答案 1 :(得分:2)
您也可以使用Akka actors进行调查,因为它们强制执行顺序消息处理,因此不会遇到此问题。这里,未处理的消息被传递给unhandled()
回调,默认情况下会记录并抛出异常。
另一件需要考虑的事情是,Akka actor将在中期内取代目前的scala.actor包。这对于拥有众多演员的大型系统尤其有用,因为目前的Scala演员并不像Akka演员那样轻量级。