Akka actoreRef с macWire DI, actoreRef не установлен

У меня есть 2 актера, Actor1 а также Actor2, Actor1 хочет отправить MyMsg1 в Actor2, а также Actor2 после некоторой работы и получения Future[MyMsg2] хочет отправить MyMsg2 в Actor1, У меня это работает в одну сторону, но с DI это не получается.

  1. Сценарий 1 - Рабочий сценарий

    • Actor1 ->MyMsg1-> Actor2
    • Actor2 MyMsgHandler - обрабатывает сообщение (с Future), делает pipeTo отправителю с MyMsg2, Работает нормально, Actor1 recvs MyMsg2
  2. Сценарий 2 - Сбой сценария

    • Actor1 вводит компонент в MacWire - myBean,
    • myBean имеет Actor2 вводится в виде бобов и отправляет 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 может отправить 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 я раскомментирую строку ниже и использую это для связи, все работает нормально. Вопрос теперь ясен? Я внедряю зависимости с MacWire

1 ответ

! определяется как:

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

Вы можете увидеть проблему сейчас, нет никакого неявного отправителя в объеме FailedService, хотя это находится в области действия "внутри" актерской реализации.

Я думаю, что вы хотите сделать:

class FailedService(actor2: ActorRef@@Actor2) {
  def testSend(implicit sender: ActorRef) = {
    actor2 ! Msg1()
  }
}
Другие вопросы по тегам