如何在Akka Typed中传递来自ActorSystem的自引用

nbnkbykc  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(164)

我试图从AKKA演员那里得到回复,但我可以在Ask方法的帮助下得到回复

object mainTest {

  val TestTypedSystem: ActorSystem[FuncTest.TypedFuncTest] = ActorSystem(FuncTest(),"FuncTest")

  implicit val sc: Scheduler = TestTypedSystem.scheduler

  implicit val ex: ExecutionContext = TestTypedSystem.executionContext

  import scala.concurrent.duration._

  import scala.language.postfixOps
  implicit val timeout: Timeout = Timeout(3 seconds)

  import FuncTest._

  //passing actorContext to the immutable Case class directly

  val testList = List (
    AskSomeoneTyped("Jay", 32, 'c',ActorRef[FuncTest.TypedFuncTest]),
    AskSomeoneTyped("Jay1", 32, 'a',ActorRef[FuncTest.TypedFuncTest]),
    AskSomeoneTyped("Jay2", 32, 'b',ActorRef[FuncTest.TypedFuncTest])
  )

  testList.foreach {
    player => TestTypedSystem ! TestaddSomeone(player)
  }

def main(args: Array[String]): Unit = {

 //Ask pattern to get responses by passing self context

 val sendingResp = TestTypedSystem.ask{
    f: ActorRef[FuncTest.TypedFuncTest] => AskSomeoneTyped("Jay",32,'c',f)
 }

  sendingResp.onComplete{
    case Success(value) => TestTypedSystem.log.info(s"Successfully completed : $value")
    case Failure(exception) => TestTypedSystem.log.warn(s"Got an exception $exception")

    }
  }
}

上面来自main方法的Ask模式帮助我通过一次传递1个参数来返回结果,但是当使用list.foreach时,我不能传递ActorSystem的上下文来获得对一个演员列表的响应。
邮件将发送到DeadLetters
有什么建议吗?

4c8rllxm

4c8rllxm1#

仍然有很多代码丢失,所以我无法验证我的答案。但是,一个有根据的猜测是:
列表中三个case类示例的第四个参数

val testList = List (
    AskSomeoneTyped("Jay", 32, 'c',ActorRef[FuncTest.TypedFuncTest]),
    AskSomeoneTyped("Jay1", 32, 'a',ActorRef[FuncTest.TypedFuncTest]),
    AskSomeoneTyped("Jay2", 32, 'b',ActorRef[FuncTest.TypedFuncTest])
  )

引用参与者引用的 * 类型 而不是 * 实际的参与者引用。如果FuncTest.apply()的行为(在上面缺少)尝试向这些“引用”发送回复,则不会有任何回复。
问题是maintest对象不是一个actor,因此没有actor引用。Akka不能向它发送消息。因此在ask模式中出现f

val sendingResp = TestTypedSystem.ask{
    f: ActorRef[FuncTest.TypedFuncTest] => AskSomeoneTyped("Jay",32,'c',f)
 }

提供此参考。请参阅文档。
您可能需要尝试更多类似的方法:

case class Someone( name: String, age: Int, grade: Char)

val people = List (
    Someone("Jay",  32, 'c'),
    Someone("Jay1", 32, 'a'),
    Someone("Jay2", 32, 'b')
)

people.map{
    case Someone( name, age, grade ) => TestTypedSystem.ask( actorRef => AskSomeoneTyped( name, age, grade, actorRef ))
}.foreach( _.onComplete
{
    case Success(value) => TestTypedSystem.log.info(s"Successfully completed : $value")
    case Failure(exception) => TestTypedSystem.log.warn(s"Got an exception $exception")
})

希望这对你有帮助。

相关问题