【发布时间】:2023-03-28 01:23:02
【问题描述】:
出于某种原因,我必须同时使用 gRPC 和 Akka。当这个演员作为顶级演员开始时,没有任何问题(在这个小演示中)。但是当它成为子actor时,它无法接收到任何消息,并记录以下内容:
[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 作为顶级actor,用ScalaTest 测试它作为子actor,这是一个错误。
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 纠正我的语法错误并完善这个问题。
标签: scala akka executioncontext akka-actor