ExecutionContext 导致 Akka 死信

斯凯347

出于某种原因,我必须同时使用 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作为顶级演员进行测试,而 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()在关闭消息后排队了该行,这做了一些繁重的工作并在时间上产生了差异)

杰弗里·钟

解决该问题的一种方法是创建service一个lazy val

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

Alazy 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进行演员测试。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Akka测试死信

来自分类Dev

如何查看Akka死信

来自分类Dev

Akka死信与问模式

来自分类Dev

如何查看Akka死信

来自分类Dev

死信箱可以在Akka中重用吗?

来自分类Dev

Akka.NET:致远程演员的死信

来自分类Dev

Akka入门教程和死信

来自分类Dev

Akka 演员 - 发件人指向死信

来自分类Dev

Akka 发件人参考包含死信

来自分类Dev

Scala Akka 演员 - 遇到死信

来自分类Dev

运行AKKA远程actor时出现“遇到死信”错误

来自分类Dev

与Akka-Streams中的mapAsync一起使用的ExecutionContext

来自分类Dev

Akka路由:回复发送到路由器的结果是死信

来自分类Dev

当 actor 包含异步方法时,这将导致死信错误和 Ask 超时异常

来自分类Dev

Akka:如何让演员导致主管异常

来自分类Dev

Akka:如何让演员导致主管异常

来自分类Dev

RabbitMQ中的死信死信消息

来自分类Dev

Akka:第一条消息变成死信,从第二条消息开始一切正常

来自分类Dev

Akka.net容错,SuperVisorStrategy并丢失导致异常的消息

来自分类Dev

如何在Akka Persistence中获取导致重启的消息

来自分类Dev

处理RabbitMQ中的死信

来自分类Dev

处理死信队列(DLQ)

来自分类Dev

Erlang死信队列

来自分类Dev

AmqpItemReader和死信队列

来自分类Dev

处理死信队列(DLQ)

来自分类Dev

死信队列未清除

来自分类Dev

重新排队死信消息

来自分类Dev

Amazon SQS死信队列:是真的死信还是有毒?

来自分类Dev

nservicebus:事件和死信队列