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)我想,如果答案来自此人本人,那么这是一个足够可靠的来源,可以证实我认为是对的。我会对你的答案投赞成票,但要把另一个标记为解决方案,因为它来得更早