如何在不阻塞的情况下使用 Akka 询问模式

How to use the Akka ask pattern without blocking

您好,我有一个 actor,负责从数据库中获取数据,将其转换为列表并将其发送回发件人。我正在使用 ask 模式来接收我的演员的响应,因为我不想使用 await.result 因为这种方法会阻塞不好的线程。

我编写了以下代码来获取我的演员的响应(我只是跳过了数据库代码以使其简单但逻辑保持不变):

class MyActor extends Actor{
   var list = new MutableList[Int]()
   list+=1
   list+=2
   list+=3
   list+=4

   def receive ={
     case "returnAlist"=>
       println("sending back list "+list +"of size "+list.size)
       sender ! list
     case message => 
       unhandled(message)
   }
}

object Test extends App{
  val system = ActorSystem("testing")
  val MyActor = system.actorOf(Props[MyActor], name = "InstitutionUserSuggestion")
  implicit val timeout = Timeout(15 seconds)
  var ResultList = new MutableList[Int]()
  val future:Future[MutableList[Int]] = ask(MyActor,"returnAlist").mapTo[MutableList[Int]] 
  future.onComplete { 
    case Success(result)=>
      println(" in sucees start")
      println("value of result "+ result.size)
      println("ResultList=result")
      ResultList = result
      println("value of ResultList "+ ResultList.size)
      println("in Success end")
    case Failure(e)=>
      println(" in failure")
      e.printStackTrace()
  }

  println("returned list size is " + ResultList.size + " and its contents" + ResultList)


}

以上代码的输出如下:

sending back list MutableList(1, 2, 3, 4)of size 4
returned list size is 0 and its contenstsMutableList()
in sucees start
value of result 4
 ResultList=result
value of ResultList 4
 in Success end

我的问题是 onComplete 代码在最后执行 我需要在控制台上显示列表 ResultList 的内容但是这一行

println("returned list size is "+ResultList.size +" and its contensts" +ResultList)
我在 onComplete 块之后写的

我认为它在 onComplete 块之前执行,所以最后列表 ResultList 中没有任何内容,所以我无法将其项目打印到控制台。

请帮助我,我应该怎么做才能不阻塞地从演员那里接收项目列表,然后将其显示在控制台上。

你不想通过等待演员的回应来阻止,所以你使用 Future 是正确的。 onComplete 函数中的代码会在您的 actor 使用列表进行响应时执行。

并且由于您不想异步阻塞和处理它,所以您的最后一个 println 语句在您的演员尚未响应时执行。

可以打印onComplete块中列表的内容:

object Test extends App{
  val system = ActorSystem("testing")
  val MyActor = system.actorOf(Props[MyActor], name = "InstitutionUserSuggestion")
  implicit val timeout = Timeout(15 seconds)

  val future: Future[List[Int]] = ask(MyActor,"returnAlist").mapTo[List[Int]] 
  future.onComplete { 
    case Success(result)=>
      println("returned list size is " + result.size +" and its contents" + result)
    case Failure(e)=>
      println("in failure")
      e.printStackTrace()
  }
}

附带说明一下,我使用了一个不可变的 List,它比使用可变集合(如 MutableList.

更符合 Scala 的惯用法