当前位置: 首页 > 知识库问答 >
问题:

Akka-重新发送“中断”消息

宋望
2023-03-14

在官方的akka 2.0.4文档中,它说:

actor重新启动只替换实际的actor对象;邮箱的内容不受重新启动的影响,因此在postRestart钩子返回后,将继续处理邮件。不会再收到触发异常的消息。在重新启动时发送给参与者的任何消息都将像往常一样排队到其邮箱。

class ResendingActor extends Actor {
  var curMessage: Option[MyMessage] = None
  def receive = {
    case MyMessage(x) => {
      curMessage = Some(MyMessage(x))
      /* processing */
      curMessage = None
    }
  }
  override def preRestart(reason: Throwable, message: Option[Any]) {
    curMessage match {
      case Some(x) => self ! x
      case None => ;
    }
  }
}

我唯一能想到的是,如果消息由于某种原因出现畸形,它将永远不会离开系统,并导致演员定期重新启动...

共有1个答案

尉迟安民
2023-03-14

您已经在preRestart中获得了失败消息(请参见:message:option[Any]),因此不需要自己隐藏它。是的,重新发送给自己是完全可以的,但要小心与此相结合的无限重启,因为你很可能最终得到一条永远不会被丢弃的信息。

 类似资料:
  • 我有一个actor,它持有一个。您可以使用以下对象从所述商店进行读写: 存储以及其值响应。 为了方便找到这家店,我有另一个演员(一个客串),我在飞行中创造: 这使我能够将所述参与者的“定位”(即通过其路径)保持在一个位置,避免在移动时进行过多的返工。此有一个可选的目标参与者,一旦执行查找,将将结果发送到该参与者。在我做一些工作之前,我在另一个参与者中使用所有这些来获取配置值: 但当我这么做时,我得

  • 标题是不言自明的,我希望能够向父执行元发送消息(意味着我希望父执行元的)。在Akka Classic(非类型化)中,父执行元的可以通过以下方式从子执行元的获得: (例如,参见这个问题(在Java))。 但是,Akka Typed中的不公开父级的。Scala中是否有惯用的方法为父执行元获取?

  • 我正在与eclipse泛美卫生组织和蚊子工作。我正在发送QOS-1级别的消息。我已经改变了mosquitto的配置,就像在这个问题中回答的那样。我正在使用mqtt镜头来测试。在用户断开连接后,Mosquitto不发送消息。

  • > 构造函数接受InetSocketAddress和actorref。InetSocketAddress是有意义的(我假设这是目的地),但是actorref是什么?这是我第一次使用akka,但据我了解,ActorRef是另一个演员的引用。既然我的TCP客户端是一个参与者,并且我希望这个TCP参与者与TCP服务器通信,而不是与另一个参与者通信,为什么我要给它一个参与者引用? 伙伴对象中的道具功能是用

  • 我正在使用JavaStkit编写一个Akka JUnit测试,并试图找出我做错了什么。 执行通过演员中的代码非常愉快。在worker中的某一点上,我希望它在ActorSystem级别将传递的相同对象(ResultAndData)返回到JUnit的收件箱。即。我希望worker将传递给它的对象返回给其父级。 但是,就像它试图返回下面的行一样: 此时我得到以下消息: 谢谢大家,任何帮助都很好。

  • 我正在使用BackoffSupervisor策略来创建一个必须处理某些消息的子参与者。我想实现一个非常简单的重启策略,其中在发生异常时: > 子级将失败消息传播给主管 supervisor重新启动子程序并再次发送失败消息。 主管重试3次后放弃 这给出了类似于以下输出的内容: 但是没有来自钩子的日志