我有两个演员,Actor1和Actor2。Actor1想要将MyMsg1发送到Actor2,而Actor2在做了一些工作之后,Future[MyMsg2]想要将MyMsg2发送给Actor1。我已经做到了一个方法,但它失败了DI。
- Actor1 -->MyMsg1-->Actor2
- Actor2 MyMsgHandler - Processes message(with Future), does pipeTo to sender with `MyMsg2`. Works fine, Actor1 recvs `MyMsg2`
- Actor1 has a bean injected via MacWire - `myBean`.
- `myBean` has `Actor2` injected as a bean and sends `MyMsg1` to Actor2
- Actor2 MyMsgHandler processes message(with Future), does pipeTo to sender and tries sending `MyMsg2` - Goes to deadLetter. The actor Ref for sender is never set.
我该怎么解决这个问题?
粘贴代码
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中使用行Actor1,我取消了它下面的行注释,并使用它来进行通信,一切都很好。问清楚了吗?我正在使用MacWire注入依赖项
发布于 2018-02-23 09:32:38
!被定义为:
def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit您现在可以看到问题了,FailedService的作用域中没有隐式发送方,尽管它在“参与者”实现的范围内。
我觉得你想做:
class FailedService(actor2: ActorRef@@Actor2) {
def testSend(implicit sender: ActorRef) = {
actor2 ! Msg1()
}
}https://stackoverflow.com/questions/48941567
复制相似问题