【问题标题】:ExecutionContext causes Akka dead letterExecutionContext 导致 Akka 死信
【发布时间】: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


【解决方案1】:

解决问题的一种方法是将service 设为lazy val

class GrpcActor extends Actor {
  ...
  lazy val service = grpcService.bindService(new GrpcServerImpl(), ec)
  ...
}

lazy val 对于长时间运行的操作很有用:在这种情况下,它会将 service 的初始化推迟到第一次使用。如果没有 lazy 修饰符,service 在创建 actor 时会被初始化。

另一种方法是在您的测试中添加Thread.sleep,以防止actor系统在actor完全初始化之前关闭:

class GrpcActorTest extends FlatSpec with Matchers {
  ...
  actor ! GlobalStart()
  Thread.sleep(5000) // or whatever length of time is needed to initialize the actor
}

(作为旁注,考虑使用 Akka Testkit 进行演员测试。)

【讨论】:

    【解决方案2】:

    向其父级添加主管策略,将 println 添加到参与者生命周期。有些东西会杀死你的演员。最后,如果你提供一个完整的例子,也许我可以说更多:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 2014-06-13
      相关资源
      最近更新 更多