我有 2 个演员,Actor1和Actor2. Actor1想要发送MyMsg1到Actor2,并且Actor2在做一些工作并得到Future[MyMsg2]想要发送MyMsg2到之后Actor1。我已经以一种方式工作,但它因 DI 而失败。
场景 1 - 工作场景
- Actor1 -->MyMsg1-->Actor2
- Actor2 MyMsgHandler - 处理消息(使用 Future),使用 pipeTo 到发送者
MyMsg2。工作正常,Actor1 recvsMyMsg2
场景 2 - 失败的场景
- Actor1 有一个通过 MacWire 注入的 bean -
myBean。 myBean已Actor2作为 bean 注入MyMsg1并发送到 Actor2- Actor2 MyMsgHandler 处理消息(使用 Future),对发送者执行 pipeTo 并尝试发送
MyMsg2- 转到 deadLetter。发送者的演员 Ref 永远不会被设置。
- Actor1 有一个通过 MacWire 注入的 bean -
我该如何解决?
也粘贴代码
class Actor1(failedService: FailedService, actor2: ActorRef @@ Actor2) extends Actor{
override def receive: Receive = {
case TriggerActor1() =>
println("Actor1 triggered from REST controller. Send msg to actor 2")
failedService.testSend()
//actor2 ! Msg1()
case Msg2() => println("got msg2 from actor 1")
}
class Actor2 extends Actor {
override def receive: Receive = {
case Msg1() => {
println("send without future")
val origsender = sender()
origsender ! Msg2()
}
}
class FailedService(actor2: ActorRef@@Actor2) {
def testSend() = {
actor2 ! Msg1()
}
}
使用我上面共享的当前代码,Actor1能够发送Msg1并Actor2
响应actor2,Msg2但Msg2会进入死信。我收到以下错误
akka.actor.DeadLetterActorRef - Message [backup.failedakka.Msg2] from Actor[akka://application/user/actor2#-662746578] to Actor[akka://application/deadLetters] was not delivered. [1] dead letters encountered.
但是,如果failedService.testSend()在我的 Actor1 中使用该行,我取消注释它下面的行并使用它进行通信,一切正常。Q现在清楚了吗?我正在使用 MacWire 注入依赖项