Akka Actors - 更改到达 actor 的消息的默认行为

Posted

技术标签:

【中文标题】Akka Actors - 更改到达 actor 的消息的默认行为【英文标题】:Akka Actors - Change default behavior of messages arriving in actors 【发布时间】:2022-01-13 16:02:21 【问题描述】:

是否有可能在Akka Actors 中安装某种“钩子”,允许您在每次有新消息到达actor 时运行一段自定义代码?注意,这不是actor开始使用receive处理消息的时刻,而是消息到达actor并被放入其邮箱的时刻。另请注意,我想更改默认行为,而不仅仅是单个演员的行为。理想情况下,我会在我的代码中仅在一个位置更改此行为,它会自动影响所有参与者,或者在每个文件/参与者中只需要 1-2 行代码(例如导入语句)。

例如,使用这个钩子应该可以在每次消息到达时记录消息,或者计算和打印插入前后邮箱大小的斐波那契。

【问题讨论】:

如果mailbox 的日志记录和监控是主要要求,请考虑Kamon。否则,请使用@LeviRamsey 帖子中链接的最后一个主题中提到的自定义MailBox。那里给出了一个自定义邮箱的简单实现。试试看,然后在演员的enqueuedequeuereceive等不同位置屏蔽代码,看看效果。 定义自定义邮箱的问题似乎是这锁定了我或其他人对邮箱的选择(我实现的那个)。我想保持代码原样,演员可以选择他们的邮箱类型,但我想为所有人添加我自己的代码。我觉得和extend的原理差不多。 添加自定义邮箱或扩展邮箱具有相同的陷阱,因为如果您不小心可能会阻塞。顺便说一句,两者都可以在一个地方配置,ActorSystem 可以使用它。 【参考方案1】:

如果您控制actor的生成(或者愿意将此邮箱用作未专门设置邮箱的actor的默认邮箱),您可以使用自定义邮箱。见the docs for details。

【讨论】:

我已经编辑了这个问题,其中包含一些在原始问题中并不清楚的额外要求。这个解决方案是否仍然适用? 点击 Levi 提供的链接,因为它确实解释了,是的,您可以更改默认邮箱。如果您在 Google 上搜索“Akka 邮箱日志记录要点”,您甚至可以找到一些代码来实现这一点。但是,我要提醒的一件事是,仅仅因为您可以添加此代码并不意味着您应该这样做。您正在将争用(并可能阻止行为)引入您的排队。如果您只是想监控邮箱的大小,还有比这更好的方法。

以上是关于Akka Actors - 更改到达 actor 的消息的默认行为的主要内容,如果未能解决你的问题,请参考以下文章

Scala Actors迁移指南

Scala框架Akka学习

二 Akka学习 - actor介绍

akka actor中的基本概念(学习小结)

akka actor 的request-response简单实现

无法从 cell.actors 导入 Actor