Akka管道完工优先权,且不成功

Akka管道完工优先权,且不成功,akka,future,Akka,Future,在我的演员身上,我做了如下事情: //upon receiving a message Future myFuture = Futures.succesful(doSomething()); myFuture.onSuccess(new OnSuccess<Object>() { @Override public void onSuccess(Object object) throws Throwable {

在我的演员身上,我做了如下事情:

//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());
//收到消息后
Future myFuture=Futures.successful(doSomething());
myFuture.onSuccess(新的onSuccess(){
@凌驾
public void onSuccess(对象对象)抛出可丢弃{
doSomethingLong(对象);
}
}调度员);
Patterns.pipe(myFuture).to(sender());
我的发送者是否会在“doSomething()”完成时(即第一个将来完成时)或在“doSomethingLong()”完成后(即onSuccess处理程序操作完成后)收到消息响应?

请注意,
onSuccess
是从Scala 2.12.0开始的。考虑移动到<代码>前缀或<代码> OnTrime<代码> < /P>
onSuccess
附加一个函数,当目标future使用一个值完成时将执行该函数。因此,回调和发送给参与者的消息将同时发生


如果您想要顺序行为,请使用
map
而不是
onSuccess

,在您的示例中,
onSuccess
管道将同时发生

如果您不希望调用可能失败的
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());
Future myFuture=Futures.successful(doSomething());
Patterns.pipe(myFuture.then)和(newoncomplete(){
未完成的公共无效(可丢弃失败,对象结果){
if(失败!=null)
doSomethingLong(结果);
}
},dispatcher())。到(发送方());

这是一个有效的假设,也是我认为应该发生的事情,但我最近在尝试提高应用程序性能时发现自己对此表示怀疑(在onComplete完成之前,发件人似乎不会收到消息,但我无法100%证明这一点)。你有没有什么来源可以完全消除我的疑虑?(顺便说一句,我们是在Scala 2.11上,因为我们在Java中使用Akka)我想,如果答案来自此人本人,那么这是一个足够可靠的来源,可以证实我认为是对的。我会对你的答案投赞成票,但要把另一个标记为解决方案,因为它来得更早