我通过执行以下代码对不同的代理进行两次调用。
Timeout t = new Timeout(100, TimeUnit.MILLISECONDS);
Future<Object> eventFuture = ask(this.customerEventActor, new GetCustomerEventActionsMessage(customerCookie), t);
Future<Object> infoFuture = ask(this.customerPersonalInfoActor, new GetCustomerPersonalInfoMessage(customerCookie), t);
在我的演员里面,我暂停了1000毫秒的线程并返回结果。我希望它会失败超时错误。但后来我看结果状态是成功的,并有一个有效的回应。 EVENTS! Time taken: 4931
因此执行时间为4931毫秒,并且没有超时。为什么呢?
public class CustomerEventActor extends UntypedActor {
@Override
public void onReceive(Object o) throws Exception {
long now = System.currentTimeMillis();
Thread.sleep(1000);
CustomerEventResponseMessage msg = new CustomerEventResponseMessage();
msg.events = "EVENTS! Time taken: " + (System.currentTimeMillis() - now);
getSender().tell(msg, getSelf());
getContext().stop(getSelf());
}
}
答案 0 :(得分:1)
当未来失败时,它不会抛出异常。
未来以两种可能的方式完成:
1)成功(结果) - 然后你可以从未来得到结果
2)失败(失败) - 你可以获得通常是异常的失败参数(在你的情况下是AskTimeoutException)
你从未真正看过完成的未来,所以你无法知道它是否成功。