Akka actoreRef с macWire DI, actoreRef не установлен
У меня есть 2 актера, Actor1
а также Actor2
, Actor1
хочет отправить MyMsg1
в Actor2
, а также Actor2
после некоторой работы и получения Future[MyMsg2]
хочет отправить MyMsg2
в Actor1
, У меня это работает в одну сторону, но с DI это не получается.
Сценарий 1 - Рабочий сценарий
- Actor1 ->MyMsg1-> Actor2
- Actor2 MyMsgHandler - обрабатывает сообщение (с Future), делает pipeTo отправителю с
MyMsg2
, Работает нормально, Actor1 recvsMyMsg2
Сценарий 2 - Сбой сценария
- Actor1 вводит компонент в MacWire -
myBean
, myBean
имеетActor2
вводится в виде бобов и отправляетMyMsg1
для Actor2- Actor2 MyMsgHandler обрабатывает сообщение (с Future), отправляет pipeTo отправителю и пытается отправить
MyMsg2
- Идет к DeadLetter. Актер Ref для отправителя никогда не устанавливается.
- Actor1 вводит компонент в MacWire -
Как это исправить?
Вставка кода также
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()
}
}