在我的演员中,我做了类似的事情:
//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>
答案 0 :(得分:1)
请注意,自Scala 2.12.0起,onSuccess
为deprecated。考虑转移到foreach
或onComplete
onSuccess
附加一个函数,当目标未来用值完成时执行。因此,回调和发送给actor的消息将同时发生。
如果您想要顺序行为,请使用map
代替onSuccess
。
答案 1 :(得分:1)
在您的示例中,onSuccess
和pipe
会同时发生。
如果您不希望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());