【发布时间】:2018-08-03 03:20:00
【问题描述】:
我有 2 个演员,Actor1 和 Actor2。 Actor1 想将MyMsg1 发送给Actor2,而Actor2 在完成一些工作后得到Future[MyMsg2] 想将MyMsg2 发送给Actor1。我有这种方法,但 DI 失败了。
-
场景 1 - 工作场景
- Actor1 -->MyMsg1-->Actor2
- Actor2 MyMsgHandler - 处理消息(使用 Future),使用
MyMsg2将 pipeTo 发送到发送者。工作正常,Actor1 接收MyMsg2
-
场景 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.
但是,如果在我的 Actor1 中使用 failedService.testSend() 行,我取消注释它下面的行
并用它来交流,一切正常。
Q现在清楚了吗?我正在使用 MacWire 注入依赖项
【问题讨论】:
-
您可以添加您的代码吗?我想帮忙。
-
@HuntsMan,我也贴了代码
-
您好,我认为是因为您使用 FailedService 作为网关而不是参与者,并且当参与者 2 将 Msg2 发送给发送者时,发送者是 FailedService 并且当前已终止并且已经死亡。和。你可以直接联系 Actor1 到 Actor2 顺便说一句 FailedService 不是演员。
标签: scala playframework akka akka-http macwire