Java Patterns.ask超时后消息的标题在哪里?

Java Patterns.ask超时后消息的标题在哪里?,java,akka,future,Java,Akka,Future,最近在Akka actor中创建的等待处理的scala.concurrent.Future对象出现了一些超时,我想知道如何处理这些超时事件。他们真的迷路了吗?它们是否被重试并保存在内存中,或者它是如何工作的 为了说明上下文,代码如下所示 List<Future<MyMessage>> futureMessageList = plainMessages.stream() .map(this::toFuture) .collect(Collectors.toL

最近在Akka actor中创建的等待处理的scala.concurrent.Future对象出现了一些超时,我想知道如何处理这些超时事件。他们真的迷路了吗?它们是否被重试并保存在内存中,或者它是如何工作的

为了说明上下文,代码如下所示

List<Future<MyMessage>> futureMessageList = plainMessages.stream()
    .map(this::toFuture)
    .collect(Collectors.toList());    

Futures.sequence(futureMessageList, ExecutionContexts.global())
                .onComplete(new OnComplete<Iterable<MyMessage>>() {
                    @Override
                    public void onComplete(Throwable throwable, Iterable<MyMessage> messages) {
                        ... // iterate futureMessageList list

那些
MyMessage
obj是否保存在内存中,然后重试?我是否应该以某种方式处理异常并使用内存列表处理那些超时的消息,或者我应该如何解决此问题?

请求
因未收到回复而超时时,它会以失败完成
未来的
(或
完成阶段
)。消息可能仍在处理中的某个位置,如果有响应,它将以死信结尾()。超时可能发生的其他情况是,如果参与者停止或崩溃处理消息,请求或响应丢失(除非响应的参与者是远程参与者,否则不太可能)

Future.sequence
将在传递给它的所有期货成功完成时成功完成,或者在其中任何一个期货失败时失败

这意味着,如果任何一个请求超时,您将在
onComplete
回调中获得
null
作为messages参数,以及来自第一个失败的未来的异常作为
throwable
参数


如果您希望获得部分结果列表,则每个结果要么是成功的值,要么是异常。在将它们传递给
future.sequence

之前,您可以在每个future上使用recover来完成这一操作,这看起来不像是超时异常。你还有别的事情要做。我以为一开始不是@texasbruce,有时会发生。但是,如果我将超时设置为,比方说,1ms,它总是会崩溃,并显示完全相同的消息。我想,未来列表在被迭代时会触发超时和空指针。非常感谢如此宝贵的响应,很高兴收到来自Akka官方开发人员的反馈:)
java.lang.NullPointerException
    at my.package.Clazz.onComplete(Clazz.java:4)
    at my.package.Clazz$1.onComplete(Clazz.java:5)
    at akka.dispatch.OnComplete.internal(Future.scala:258)
    at akka.dispatch.OnComplete.internal(Future.scala:256)
    at akka.dispatch.japi$CallbackBridge.apply(Future.scala:186)
    at akka.dispatch.japi$CallbackBridge.apply(Future.scala:183)
    at scala.concurrent.impl.CallbackRunnable.run$$$capture(Promise.scala:32)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala)
    at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)