Akka ask()超时不起作用

时间:2015-04-09 17:38:13

标签: java akka

我通过执行以下代码对不同的代理进行两次调用。

 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());
    }
}

1 个答案:

答案 0 :(得分:1)

当未来失败时,它不会抛出异常。

未来以两种可能的方式完成:
1)成功(结果) - 然后你可以从未来得到结果 2)失败(失败) - 你可以获得通常是异常的失败参数(在你的情况下是AskTimeoutException)

你从未真正看过完成的未来,所以你无法知道它是否成功。