【问题标题】:Simple Akka mailbox configuration to discard overflowing messages简单的 Akka 邮箱配置以丢弃溢出的消息
【发布时间】:2013-11-14 04:26:13
【问题描述】:

我有一个包含 2 个参与者的系统,它们共享相同的配置。这个期望的配置是:“邮箱的最大容量应该是 1 封邮件,并且任何溢出的邮件都应该被丢弃”。

最简单的设置方法是什么?

我已尝试将以下内容放入(Play Framework's)application.conf

akka.actor.default-mailbox {
    mailbox-type = "akka.dispatch.BoundedMailbox"
    mailbox-capacity = 1
}

但它不起作用:演员的邮箱在忙碌时仍然会堆积消息,并在可用时处理每个消息。要么演员不关心application.conf的内容,要么上面的配置不正确。

有什么想法吗?

【问题讨论】:

  • 您的问题与this 非常相似。你可以在那里找到几个可能的解决方案。
  • 在 Akka2 中无法读取邮箱大小,不是吗?如果我应该重新设计我的 Scala 应用程序,那就这样吧。到目前为止,我一直在使用 Akka,因为我想运行定期任务,例如“每秒运行此函数,除非它仍在运行”。如何在 Scala 中做到这一点?
  • 如果你需要每秒运行一些东西,你应该看看 Akka 中的调度程序内置。只需调用 system.scheduler.schedule(initialDelay, interval, your-function)。您还可以使用调度程序将消息发送给参与者一次或使用设定的时间间隔。
  • @pushy 感谢您的建议,它看起来像我需要的。 API 指示def schedule (initialDelay: Duration, frequency: Duration)(f: ⇒ Unit),但我对 Scala 非常缺乏经验,因此需要此调用的代码示例。该函数将是在外部Object 中定义的公共函数

标签: scala akka actor


【解决方案1】:

将actor系统中所有actor的默认邮箱设置为只有一个项目的有界邮箱并不是一个好主意,最好将你的actor配置为使用the Akka documentation中描述的指定邮箱。通过部署或直接在代码中。

您的邮箱配置还需要一个推送超时,如果您想立即丢弃邮件,您可以将其设置为 0。

【讨论】:

  • 感谢您的回复,我保留了相同的代码,但在application.conf 中添加了mailbox-push-timeout-time = 0s,但并没有改变任何事情。
  • 将 push-timeout 设置为 0 在我的情况下有效。谢谢!
【解决方案2】:

如果你像我一样想要一个最大容量为 1 的邮箱,并丢弃溢出的邮件,我建议使用 java.util.Timer 而不是 Akka。

这是我在 Scala 程序中写的:

MyTask.scala:

object MyTask extends TimerTask {
  var isRunning = false;

  def run() {
    if (!isRunning) {
      isRunning = true

      [...]

      isRunning = false
    }
  }
}

0ms后执行任务,每秒重复一次:

new Timer().schedule(MyTask, 0, 1000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多