在actor中使用spray client(sendReceive)

时间:2015-02-05 10:51:51

标签: akka actor spray spray-client

用例是这样的:

  1. Actor绑定到喷射IO - 接收和处理来自指定端口的所有入站HTTP请求。
  2. 对于每个入站请求,actor需要向另一个外部端点发送出站异步http请求,获取入站响应并将响应发送回发起方。
  3. 使用spray的客户端sendReceive返回未来。这意味着actor将继续处理其邮箱上的下一个入站消息,而无需等待它刚刚发送的出站请求的响应,同时出站请求的响应可能到达并在Future回调上执行因为它没有在actor的邮箱中排队,所以它可能会并行执行,打破了在给定时间内只有一个线程执行的actor的想法。

    我想知道如何在不破坏actor线程封装的情况下处理这个用例,actor如何以actor安全的方式使用spray-client(用于发送/接收异步http事件)?

2 个答案:

答案 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。遗憾的是,还没有办法在编译时检测这些非法​​访问。"