【发布时间】:2016-06-07 15:32:16
【问题描述】:
以下代码示例(您可以复制并运行)显示了一个MyParentActor,它创建了一个MyChildActor。
MyChildActor 为其第一条消息引发异常,导致其重新启动。
但是,我想要实现的是在 MyChildActor 重新启动时“消息 2”之前仍然处理“消息 1”。
相反,消息 1 被添加到邮箱队列的尾部,因此消息 2 被首先处理。
如何在演员重启时对原始消息进行排序,而无需创建自己的邮箱等?
object TestApp extends App {
var count = 0
val actorSystem = ActorSystem()
val parentActor = actorSystem.actorOf(Props(classOf[MyParentActor]))
parentActor ! "Message 1"
parentActor ! "Message 2"
class MyParentActor extends Actor with ActorLogging{
var childActor: ActorRef = null
@throws[Exception](classOf[Exception])
override def preStart(): Unit = {
childActor = context.actorOf(Props(classOf[MyChildActor]))
}
override def receive = {
case message: Any => {
childActor ! message
}
}
override def supervisorStrategy: SupervisorStrategy = {
OneForOneStrategy() {
case _: CustomException => Restart
case _: Exception => Restart
}
}
}
class MyChildActor extends Actor with ActorLogging{
override def preRestart(reason: Throwable, message: Option[Any]): Unit = {
message match {
case Some(e) => self ! e
}
}
override def receive = {
case message: String => {
if (count == 0) {
count += 1
throw new CustomException("Exception occurred")
}
log.info("Received message {}", message)
}
}
}
class CustomException(message: String) extends RuntimeException(message)
}
【问题讨论】:
标签: akka