出于某种原因,我必须同时使用gRPC和Akka。当这个演员成为顶级演员时,没有任何问题(在这个小演示中)。但是,当它成为一个儿童演员,也没有收到任何消息,并且以下记录:ExecutionContext导致Akka死信
[default-akka.actor.default-dispatcher-6] [akka://default/user/Grpc] Message [AkkaMessage.package$GlobalStart] from Actor[akka://default/user/TrackerCore#-808631363] to Actor[akka://default/user/Grpc#-1834173068] was not delivered. [1] dead letters encountered.
的例子核心:
class GrpcActor() extends Actor {
val ec = scala.concurrent.ExecutionContext.global
val service = grpcService.bindService(new GrpcServerImpl(), ec)
override def receive: Receive = {
case GlobalStart() => {
println("GlobalStart")
}
...
}
}
我试图创建一个新的ExecutionContext
,如:
scala.concurrent.ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
为什么会发生这种情况,以及如何调试像这样的死信问题(不会引发异常)?
更新:
对不起,我没有在这里列出一切。我使用普通的Main方法来测试GrpcActor
作为顶级演员,而ScalaTest将其测试为小孩演员,这是一个错误。
class GrpcActorTest extends FlatSpec with Matchers{
implicit val system = ActorSystem()
val actor: ActorRef = system.actorOf(Props[GrpcActor])
actor ! GlobalStart()
}
这是一个空的测试套件,主动关闭整个actor系统。但问题出在这条线上
val service = grpcService.bindService(new GrpcServerImpl(), ec)
GlobalStart()
的交付延迟后关闭。
没有该行,消息可以在关闭之前传递。
这是正常行为吗?
(我的猜测:它发生的GlobalStart()
与该行,其中做了一些繁重的工作和取得的时间差的停产消息后排队)
感谢@chunjef纠正我的语法错误,并完善这个问题。 – Skye347