Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
消息发送到死信而不是发送方(akka路由器)[scala]_Akka_Router_Actor_Dead Letter_Scaldi - Fatal编程技术网

消息发送到死信而不是发送方(akka路由器)[scala]

消息发送到死信而不是发送方(akka路由器)[scala],akka,router,actor,dead-letter,scaldi,Akka,Router,Actor,Dead Letter,Scaldi,实际上,我在让我的演员(路由器)系统正常工作方面遇到了麻烦。 我的设置: 我想在游戏控制器中使用akka路由器。对于依赖注入,我使用sphorti I模块: class UserDAOModule extends Module { binding to new ExampleRouter binding toProvider new UserDAOWorker } akka路由器: class UserDAORouter(implicit inj:Injector) extends A

实际上,我在让我的演员(路由器)系统正常工作方面遇到了麻烦。 我的设置:

我想在游戏控制器中使用akka路由器。对于依赖注入,我使用sphorti

I模块:

class UserDAOModule extends Module {
  binding to new ExampleRouter
  binding toProvider new UserDAOWorker
}
akka路由器:

class UserDAORouter(implicit inj:Injector) extends Actor with AkkaInjectable {

  val userDAOProps = injectActorProps[UserDAOWorker]

  var router = {
    val routees = Vector.fill(5) {
      val r = context.actorOf(userDAOProps)
      context watch r
      ActorRefRoutee(r)
    }
    Router(RoundRobinRoutingLogic(), routees)
  }

  override def receive: Receive = {
    case mm: MongoDBMessage =>
      router.route(mm, sender)
    case Terminated(a) =>
      router = router.removeRoutee(a)
      val r = context.actorOf(userDAOProps)
      context watch r
      router = router.addRoutee(r)
  }

}
工人:

class UserDAOWorker(implicit inj:Injector) extends Actor with Injectable {

  val db = inject[DefaultDB]
  val collection:JSONCollection = db("users")
  val currentSender = sender

  override def receive: Receive = {
    case InsertUser(user) => insertUser(user)
  }

  def insertUser(user:User) = {
    collection.save(user).onComplete {
      case Failure(e) => currentSender ! new UserDAOReturnMessage(Some(e), None)
      case Success(lastError) => currentSender ! new UserDAOReturnMessage(None, lastError)
    }
  }
}
当我向路由器发送消息(insertUser消息)时,它被正确路由,并且工作人员收到消息,但是当工作人员将消息发送回发送者时,它无法被传递,因此它被发送到死信办公室。我想不出怎么解决这个问题。有人能帮我吗


提前感谢

我想问题在于,在创建actor时,构造函数中的currentSender被初始化为null(即ActorRef.noSender)。'发件人“”仅在接收()中接收消息的上下文中有效。向ActorRef.noSender发送消息相当于向死信队列发送消息

像这样的方法应该会奏效:

class UserDAOWorker(implicit inj:Injector) extends Actor with Injectable {

  val db = inject[DefaultDB]
  val collection:JSONCollection = db("users")

  override def receive: Receive = {
    case InsertUser(user) => {
      insertUser(sender, user)
    }
  }

  def insertUser(currentSender : ActorRef, user:User) = {
    collection.save(user).onComplete {
      case Failure(e) => currentSender ! new UserDAOReturnMessage(Some(e), None)
      case Success(lastError) => currentSender ! new UserDAOReturnMessage(None, lastError)
    }
  }
}

谢谢你的回复。关于那件事你完全正确。。愚蠢的错误。但是,即使我改变了这一点,路由器在调用sender()方法时,首先已经获得了一个ActorRef到“dead letter”actor。它是否应该将actorRef发送给代表我的控制器(实际上发送实际消息)的临时参与者?还是我错了?也许这和我的滚烫配置有关。。!?我刚发现我的装订不正确。。当我将“binding to new UserDaoRouter”更改为“binding to Provider new UserDaoRouter”时,它可以工作,但每次注入路由器时,Bushuti都会提供一个新实例,这与我想要的不一样。这就引出了另一个问题: