你好,我有一个演员负责从数据库中获取数据,将其转换为列表并将其发送回发件人。我使用ask
模式接收来自我的演员的响应,因为我不想使用await.result
,因为这种方法会阻塞线程,这是不好的。
我编写了以下代码来从我的演员获得响应(我跳过了db代码以保持简单,但逻辑仍然相同):
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
列表中没有任何内容,因此我无法将其项目打印到控制台。
请帮帮我,我该怎么做才能在不阻塞的情况下从actor接收项目列表,并在控制台上显示它们。
Await.result
。你可以将它写在Future.onComplete
块中,或者使用Await.result
来阻塞并等待结果,然后再打印它。 - Peter Neyenstimeout
内没有响应,那么Future
将变成一个Failure
。更多信息请参见 akka 文档。 - Peter Neyens