首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Akka与macWire DI,actoreRef未设置

Akka与macWire DI,actoreRef未设置
EN

Stack Overflow用户
提问于 2018-02-23 05:17:26
回答 1查看 66关注 0票数 0

我有两个演员,Actor1Actor2Actor1想要将MyMsg1发送到Actor2,而Actor2在做了一些工作之后,Future[MyMsg2]想要将MyMsg2发送给Actor1。我已经做到了一个方法,但它失败了DI。

  1. 设想1-工作方案
代码语言:javascript
复制
- Actor1 -->MyMsg1-->Actor2
- Actor2 MyMsgHandler - Processes message(with Future), does pipeTo to sender with `MyMsg2`. Works fine, Actor1 recvs `MyMsg2`

  1. Scenario2 -失败方案
代码语言:javascript
复制
- 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. 

我该怎么解决这个问题?

粘贴代码

代码语言:javascript
复制
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发送到Actor2actor2可以使用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注入依赖项

EN

回答 1

Stack Overflow用户

发布于 2018-02-23 09:32:38

!被定义为:

代码语言:javascript
复制
def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit

您现在可以看到问题了,FailedService的作用域中没有隐式发送方,尽管它在“参与者”实现的范围内。

我觉得你想做:

代码语言:javascript
复制
class FailedService(actor2: ActorRef@@Actor2) {
  def testSend(implicit sender: ActorRef) = {
    actor2 ! Msg1()
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48941567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档