0

我有 2 个演员,Actor1Actor2. Actor1想要发送MyMsg1Actor2,并且Actor2在做一些工作并得到Future[MyMsg2]想要发送MyMsg2到之后Actor1。我已经以一种方式工作,但它因 DI 而失败。

  1. 场景 1 - 工作场景

    • Actor1 -->MyMsg1-->Actor2
    • Actor2 MyMsgHandler - 处理消息(使用 Future),使用 pipeTo 到发送者MyMsg2。工作正常,Actor1 recvsMyMsg2
  2. 场景 2 - 失败的场景

    • Actor1 有一个通过 MacWire 注入的 bean - myBean
    • myBeanActor2作为 bean 注入MyMsg1并发送到 Actor2
    • Actor2 MyMsgHandler 处理消息(使用 Future),对发送者执行 pipeTo 并尝试发送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能够发送Msg1Actor2 响应actor2Msg2Msg2会进入死信。我收到以下错误 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 注入依赖项

4

1 回答 1

1

! is defined as:

def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit

You can see the problem now, there's no implicit sender in scope of FailedService, although it is in scope "inside" an actor implementation.

I think you want to do:

class FailedService(actor2: ActorRef@@Actor2) {
  def testSend(implicit sender: ActorRef) = {
    actor2 ! Msg1()
  }
}
于 2018-02-23T09:32:38.510 回答