每个Akka教程及其祖母都自豪地显示代码片段,如下所示,展示如何通过Akka Futures执行异步,非阻塞ask
:
// Groovy pseudo code
class Fizz extends UntypedActor {
ActorRef buzz
Fizz(ActorRef buzz) {
super()
this.buzz = buzz
}
@Override
void onReceive(Object message) {
if(message instanceof DoSomething) {
DoSomething ds = message as DoSomething
Foo foo = doSomething(ds)
Future<BuzzResult> buzzFut = buzz.ask(new ProcessResult(foo))
buzzFut.onSuccess(new BuzzResultHandler(), system.dispatcher)
}
}
Foo doSomething(DoSomething ds) { … }
}
但我无处可以找到一个代码段,其中显示如何在另一方(收件人)方面<{>}提供此服务{/ 1}} 。好的,ask
Fizz
版ask
带有Buzz
消息,并设置了ProcessResult
处理程序以捕获结果onSuccess
把它发回去。 但Buzz
如何实际发送回去?!
Buzz
是一个演员,所以它通过Buzz
完成所有消息传递:
onReceive
如果class Buzz extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof ProcessResult) {
ProcessResult pr = message as ProcessResult
BuzzResult br = BuzzResultFactory.createBuzzResult(pr)
// Oh snap, I can’t send ‘br’ back to the Fizz’s BuzzResultHandler
// because I return void…
}
}
}
返回onReceive
, void
({1}}(或任何其他演员)在ask
某事情时,怎么可能返回结果?!?
当然,我欢迎并且非常感谢任何答案,即使在Scala中,但是要求任何代码片段都是Java,因为Scala对我来说就像是象形文字。
答案 0 :(得分:2)
实际上非常简单。
您只需回复发件人:
sender().tell(yourResponse)
由于您使用的是ask-Pattern,因此请求的实际发起者不会收到此响应,而是由onSuccessHandler接收。