我有两个演员,Actor1
和Actor2
。 Actor1
想要将MyMsg1
发送到Actor2
,并Actor2
做完一些工作并让Future[MyMsg2]
想要MyMsg2
发送给Actor1
}。我有一个工作方式,但它失败了DI。
场景1 - 工作场景
MyMsg2
将pipeTo发送给发件人。工作正常,Actor1收回MyMsg2
场景2 - 失败场景
myBean
。 myBean
将Actor2
作为bean注入,并将MyMsg1
发送给Actor2 MyMsg2
- 转到deadLetter。永远不会设置发件人参与者Ref。 我该如何解决这个问题?
粘贴代码
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
答案 0 :(得分:1)
!
定义为:
def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit
您现在可以看到问题,FailedService
范围内没有隐式发件人,尽管它在范围内"内部"演员实施。
我想你想做:
class FailedService(actor2: ActorRef@@Actor2) {
def testSend(implicit sender: ActorRef) = {
actor2 ! Msg1()
}
}