actor的默认行为是restart . 为了更好地理解,我创建了两个actor并导致重启:
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)
}
所以 PingActor 在崩溃之前发送消息,并且当Ping actor重新启动时 PongActor 回复它接受消息但发送者( PongActor )不可用 . 我确实在deadLetters中看到了这一行
[INFO] [MyActorSystem-akka.actor.default-dispatcher-4] [akka:// MyActorSystem / user / pingActor / pongActor]来自Actor的消息[com.example.PingActor $ PingMessage] [akka:// MyActorSystem / user / pingActor#-1362690296]到演员[akka:// MyActorSystem / user / pingActor / pongActor#1725419686]未送达 . [1]遇到死信 . 可以使用配置设置'akka.log-dead-letters'和'akka.log-dead-letters-during-shutdown'关闭或调整此日志记录 .
why the sender that sent the message prior to the crash is not available ? is there a way to overcome it ?