在 Akka-Java Land 的接收端实现 Ask 模式
Implementing the Ask Pattern on the Recipient-Side in Akka-Java Land
每个 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) { … }
}
但实际上我在任何地方都找不到显示如何在另一方(接收方)服务此 ask
的代码片段。好的,所以 Fizz
已经 ask
ed 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
returns void
,怎么可能 return ask
编辑某些东西的结果 Fizz
(或任何其他演员)?!?
当然我欢迎并且非常感谢任何答案,即使是在 Scala 中,但会要求任何代码片段都在 Java 中,因为 Scala 看起来像象形文字对我来说。
其实很简单
您刚刚回复发件人:
sender().tell(yourResponse)
由于您使用的是 ask-Pattern,因此请求的实际发起者不会收到此响应,而是由 onSuccessHandler 收到。
每个 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) { … }
}
但实际上我在任何地方都找不到显示如何在另一方(接收方)服务此 ask
的代码片段。好的,所以 Fizz
已经 ask
ed 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
returns void
,怎么可能 return ask
编辑某些东西的结果 Fizz
(或任何其他演员)?!?
当然我欢迎并且非常感谢任何答案,即使是在 Scala 中,但会要求任何代码片段都在 Java 中,因为 Scala 看起来像象形文字对我来说。
其实很简单
您刚刚回复发件人:
sender().tell(yourResponse)
由于您使用的是 ask-Pattern,因此请求的实际发起者不会收到此响应,而是由 onSuccessHandler 收到。