使用onSuccess的Akka管道完成优先级

时间:2017-06-15 09:17:20

标签: akka future

在我的演员中,我做了类似的事情:

//upon receiving a message
Future myFuture = Futures.succesful(doSomething());
myFuture.onSuccess(new OnSuccess<Object>() {
            @Override
            public void onSuccess(Object object) throws Throwable {
                doSomethingLong(object);
            }
        }, dispatcher);
Patterns.pipe(myFuture).to(sender());

我的发件人是否会在“doSomething()”完成时收到消息响应,即第一个未来完成时,或者“doSomethingLong()”完成后,即onSuccess处理程序操作完成后?< / p>

2 个答案:

答案 0 :(得分:1)

请注意,自Scala 2.12.0起,onSuccessdeprecated。考虑转移到foreachonComplete

onSuccess附加一个函数,当目标未来用值完成时执行。因此,回调和发送给actor的消息将同时发生。

如果您想要顺序行为,请使用map代替onSuccess

答案 1 :(得分:1)

在您的示例中,onSuccesspipe会同时发生。

如果您不希望doSomethingLong()的调用可能失败影响结果,并且您希望在将其发送给发件人之前执行,那么我建议如下:

Future myFuture = Futures.successful(doSomething());
Patterns.pipe(myFuture.andThen(new OnComplete<Object>() {
    public void onComplete(Throwable failure, Object result) {
      if (failure != null)
        doSomethingLong(result);
    }
  }, dispatcher)).to(sender());