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

了解崩溃时akka actor的默认行为

欧阳向文
2023-03-14
class PingActor extends Actor with ActorLogging {
  import PingActor._
  override def postRestart(reason: Throwable): Unit = {
    log.info(s"RESTARTING")
    super.postRestart(reason)
  }
  var counter = 0
  val pongActor = context.actorOf(PongActor.props, "pongActor")
  def receive = {
    case Initialize => 
      pongActor ! PingMessage("ping")   
    case PongActor.PongMessage(text) =>
      log.info("In PingActor - received message: {}", text)
      counter += 1
      if (counter == 3) {
         log.info("FIN")
        context.system.shutdown()
      }
      if (counter == 2) {
        sender() ! PingMessage("ping")
        throw new IllegalArgumentException("Aooch")

      }
      else sender() ! PingMessage("ping")
  } 
}
object PingActor {
  val props = Props[PingActor]
  case object Initialize
  case class PingMessage(text: String)
}

class PongActor extends Actor with ActorLogging {
  import PongActor._
  def receive = {
    case PingActor.PingMessage(text) => 
      log.info("In PongActor - received message: {}", text)
      sender() ! PongMessage("pong")
  }
}

object PongActor {
  val props = Props[PongActor]
  case class PongMessage(text: String)
}

为什么在崩溃前发送消息的发件人不可用?有办法克服吗?

共有1个答案

金子轩
2023-03-14

正如文档所述,重新启动参与者时的默认行为是停止该参与者的所有子角色。这就是重新启动后发送给发件人的邮件变成死信的原因。您需要重写默认行为,并在prestart()挂钩中设置子级的初始化(即pongactor)。另外,删除对super.postrestart(reason)的调用。

class PingActor extends Actor with ActorLogging {
  import PingActor._

  override def preStart(): Unit = {
    pongActor = Option(context.actorOf(PongActor.props, "pongActor"))
  }

  override def preRestart(reason: Throwable, message: Option[Any]): Unit = {
    log.info("Don't stop the children")
    postStop()
  }

  override def postRestart(reason: Throwable): Unit = {
    log.info("RESTARTING")
  }

  var counter = 0
  var pongActor: Option[ActorRef] = None

  def receive = {
    case Initialize => 
      pongActor.foreach(_ ! PingMessage("ping"))
    case PongActor.PongMessage(text) =>
      ...
  } 
}

进行上述更改会导致以下输出:

In PongActor - received message: ping
In PingActor - received message: pong
In PongActor - received message: ping
In PingActor - received message: pong
In PongActor - received message: ping
Don't stop the children
RESTARTING
In PingActor - received message: pong
In PongActor - received message: ping
In PingActor - received message: pong
In PongActor - received message: ping
Don't stop the children
RESTARTING
In PingActor - received message: pong
In PongActor - received message: ping
In PingActor - received message: pong
In PongActor - received message: ping
Don't stop the children
RESTARTING
In PingActor - received message: pong
In PongActor - received message: ping
...

除了第一个链接之外,更多关于重新启动的信息可以在这里找到。

 类似资料:
  • 我遵循默认的Mod Base教程,偶然发现了一个问题。当我尝试以默认方式开始新的跑步时,游戏崩溃: 正因为如此,我使用了BaseMod的调试控制台,看看我是否可以手动添加卡片、遗物、药水等。 DefaultMod中起作用的东西: 所有4件文物 此外,这些消息在通过IntelliJ调试ModTheSpire时出现。 此选项在ModSpire mod选择窗口中: 这一次是在修补过程中(我想是吧?),这

  • 我试图在选项菜单中从主菜单调用另一个活动。当我从自己的选项菜单中调用主活动时,它将正常工作,但调用另一个意图将产生异常,应用程序将崩溃。我使用了try and catch,发现当它到达这条线时会崩溃: 下面是我的主java文件和应用程序清单文件。 } 对于manirfest: Logcat:

  • 但是,在日志配置的xml文件中,冒号后面总是有一个破折号。这是为什么?例如: ” 2.不断变化的财产名称 特别是,此属性在application.properties(或.yml)中没有等价属性来配置它 ${log_file_total_size_cap:-0} 如果要将该属性更改为其他值,则必须设置LOG_FILE_TOTAL_SIZE_CAP属性。我如何在仍然使用spring Boot提供的原

  • 问题内容: 当我选择2个条件时,mysql总是崩溃。对我来说,这个问题很奇怪: 就是为了这张桌子 这只发生在我的笔记本上。我们有具有相同版本mysql和相同sql的测试服务器(linux)可以 仅在任何一种情况下都不会发生 我尝试删除并重新创建表,转储数据,问题仍然存在 我尝试重新安装相同版本的mysql,并在笔记本中再次发生 有人说mysql 5.6可以,我没有尝试 Mysql版本是5.7.17

  • 我使用getStringArrayListExtra()搜索将列表从一个活动传输到另一个活动。这在第一次(从MainActivity到Diag2Activity)时运行良好,但在第二次(从Diag2Activity到SSToActivity)时应用程序崩溃。 每次我使用相同的方法:第一次活动: 第二项活动: 谁能告诉我错误可能来自哪里?提前谢谢 请在下面找到完整的代码: 主要活动。JAVA } 主

  • 我使用了新的Google Firebase SDK,现在我们一登录Sinch就崩溃了。 我正在使用以下依赖项