如何在不阻塞的情况下使用 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 的惯用法
您好,我有一个 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
.