在 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 已经 asked BuzzProcessResult 消息,并且设置了一个 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 收到。