Akka actoreRef与macWire DI,actoreRef未设置

时间:2018-02-23 05:17:27

标签: scala playframework akka akka-http macwire

我有两个演员,Actor1Actor2Actor1想要将MyMsg1发送到Actor2,并Actor2做完一些工作并让Future[MyMsg2]想要MyMsg2发送给Actor1 }。我有一个工作方式,但它失败了DI。

  1. 场景1 - 工作场景

    • Actor1 - > MyMsg1 - > Actor2
    • Actor2 MyMsgHandler - 处理消息(使用Future),使用MyMsg2将pipeTo发送给发件人。工作正常,Actor1收回MyMsg2
  2. 场景2 - 失败场景

    • Actor1有一个通过MacWire注入的bean - myBean
    • myBeanActor2作为bean注入,并将MyMsg1发送给Actor2
    • Actor2 MyMsgHandler处理消息(使用Future),将pipeTo发送给发件人并尝试发送MyMsg2 - 转到deadLetter。永远不会设置发件人参与者Ref。
  3. 我该如何解决这个问题?

    粘贴代码

    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发送到Actor2actor2Msg2回复,但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

    注入依赖项

1 个答案:

答案 0 :(得分:1)

!定义为:

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

您现在可以看到问题,FailedService范围内没有隐式发件人,尽管它在范围内"内部"演员实施。

我想你想做:

class FailedService(actor2: ActorRef@@Actor2) {
  def testSend(implicit sender: ActorRef) = {
    actor2 ! Msg1()
  }
}