用例是这样的:
使用spray的客户端sendReceive返回未来。这意味着actor将继续处理其邮箱上的下一个入站消息,而无需等待它刚刚发送的出站请求的响应,同时出站请求的响应可能到达并在Future回调上执行因为它没有在actor的邮箱中排队,所以它可能会并行执行,打破了在给定时间内只有一个线程执行的actor的想法。
我想知道如何在不破坏actor线程封装的情况下处理这个用例,actor如何以actor安全的方式使用spray-client(用于发送/接收异步http事件)?
答案 0 :(得分:0)
完成未来是完全安全的,而不是spray-routing
中的实际值,因此,例如,您可以执行以下操作:
get {
comlete {
val resultFuture: Future[Result] = ...
val resultFuture.onComplete {....}
resultFuture
}
}
当然,您还需要确保处理超时和错误情况。
答案 1 :(得分:0)
问题是哪个线程执行回调,如果它没有在actor的邮箱中排队,那么它可能是对actor接收处理的并行执行,这可能会破坏它的线程封装......
根据我的理解,akka演员也有同样的问题'问'返回Future的方法,它们提供警告,不在回调内对actor的可变状态执行操作,因为它可能导致同步问题。见:http://doc.akka.io/docs/akka/snapshot/scala/actors.html
"警告: 在使用将来的回调时,例如onComplete,onSuccess和onFailure,你需要小心避免关闭包含actor的引用,即不要在回调中调用方法或访问封闭actor上的可变状态。这将破坏actor封装并可能引入同步错误和竞争条件,因为回调将同时调度到封闭的actor。遗憾的是,还没有办法在编译时检测这些非法访问。"