阅读Scala文档我很难理解ask和tell之间的区别。
http://doc.akka.io/docs/akka/snapshot/scala/actors.html州:
!意思是“即发即忘”,例如异步发送消息 马上回来。也称为告诉。
?异步发送消息并返回表示a的Future 可能的答复。也称为问。
如果我使用的演员生成网络请求,那么ask和tell之间有什么区别?在这两种情况下,请求都将异步生成,并且必须等待响应,换句话说,如何"告诉"如果actor正在调用Web服务并等待响应,则立即返回?
答案 0 :(得分:12)
ask
和tell
之间的区别是从邮件发件人(不一定是演员)的角度出发。 ask
将发送消息并返回未来,可以等到超时或收到回复,tell
将发送消息并立即返回。
在ask
的情况下,接收消息的actor应该在操作完成时回复发件人。
答案 1 :(得分:11)
听起来您已经知道ask
和tell
之间的基本区别,但不了解tell
如何用于让其他参与者参与处理HTTP请求。
为了在HTTP请求处理程序中使用tell
是有意义的,您必须使用不要求请求处理程序返回其响应的HTTP服务器。 Spray就是这样的HTTP服务器。
在Spray中,请求处理程序不返回其响应;给它一个RequestContext对象,响应请求涉及调用它的一些方法。您可以简单地将RequestContext发送给另一个actor,然后该actor可以响应请求:
path("foo") {
rc => rc complete "foo" // respond here
} ~
path("bar") {
rc => barActor ! DoBar(rc) // send it to bar; NO RESPONSE HERE
}
然后barActor提到的演员可以说
case DoBar(rc) =>
rc complete "bar" // respond here, in another actor
Spray将请求上下文打包成一个可以从任何actor传递并完成的对象这一事实非常适合actor模型。另一方面,如果您的Web框架要求被调用的处理程序返回响应,那么如果您想要涉及另一个actor,您唯一的选择是使用ask
。
Typesafe宣布Play
将很快使用Spray。我希望这意味着Play
将允许将请求发送给其他参与者进行处理。