在Akka-Java Land中实现收件人侧的询问模式

时间:2015-08-06 10:26:12

标签: java asynchronous akka actor future

每个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 Fizzask带有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对我来说就像是象形文字。

1 个答案:

答案 0 :(得分:2)

实际上非常简单。

您只需回复发件人:

sender().tell(yourResponse)

由于您使用的是ask-Pattern,因此请求的实际发起者不会收到此响应,而是由onSuccessHandler接收。