我试图找出等待由actor处理的待处理队列项的数量。
我确信必须有一个方法可以从actor上下文或context.system.mailboxes等引用
以下是代码示例:
class SomeActor extends Actor {
override def receive = {
case ScanExisting => {
val queueSize = context.system.mailboxes... size ??
}
答案 0 :(得分:9)
这种方法存在于Akka 1.x中,但在Akka 2.0中被删除。 Roland Kuhn写了一篇详细的blog post(摘自Akka用户名单上的discussion),解释了这一决定背后的理由。这是一段摘录,概述了查询演员邮箱大小的一些问题:
从并发队列中获取一些大小的答案需要花费O(n)时间,即当你感觉到最痛苦时查询伤害(如果耐用邮箱在“错误”的情况下甚至可能需要几秒钟时刻”)
答案不正确,即在处理此请求的开头或结尾处不需要匹配实际尺寸
使其“更正确”涉及严重限制可扩展性的簿记
即使这样,当您在代码中收到该号码时,该号码可能已经完全改变了(例如,您的线程计划为100毫秒,在此期间您将获得100.000条新消息)。
阅读整篇文章,然后重新考虑获取演员邮箱大小的原因。如果你还想要它:
如果您不能没有,可以很容易地编写自己的邮箱实现,基于akka.dispatch包中的特征并将记录代码插入enqueue()和dequeue()。然后你可以使用向下转换(邪恶)或在akka.actor.Extension(推荐)中跟踪你的邮箱,以便从你的演员中访问统计数据并做任何必要的事情。
但等等:我是否提到用时间戳标记延迟关键(但不是太高频率)的消息甚至更容易,并在处理时对消息的年龄作出反应?
因此,总结一下:虽然仍有办法获取邮箱大小,但您可能永远不需要它。
如果您希望将演员邮箱大小用于监控目的,请查看Lightbend Telemetry或Kamon。此外,Patrik Nordwall写了一个gist,当邮箱超过配置的限制时会记录邮箱大小。