Недавно были некоторые тайм-ауты с scala .concurrent.Future объектами, созданными в ожидании обработки в актере Akka, и мне было интересно, как обрабатывать эти события тайм-аута. Они действительно потеряны? Они повторяются и сохраняются в памяти или как это работает?
Чтобы добавить немного контекста, код выглядит следующим образом:
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
В onComplete
итерации по futureMessageList
, который в основном состоит из Future
объектов, которые инкапсулируют MyMessage
.
Однако функция toFuture
делает Patterns.ask()
с данным диспетчером, и это, кажется, заняв больше времени, которое я отправил (60 секунд) . Примите во внимание, что время отклика зависит от базовой системы, которая может находиться под высокой нагрузкой или без самой быстрой сети в зависимости от среды, в которой она работает.
Future<MyMessage> message = Patterns.ask(actorSystem.getSampleDispatcher(), msg, TIMEOUT_60_SECS)
Поэтому мой вопрос таков: после onComplete
выдает следующее исключение из-за того, что Future не обрабатывается вовремя ...
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)
Сохраняются ли эти MyMessage
ob js в памяти и затем повторяются? Должен ли я как-то обработать исключение и обработать эти сообщения с тайм-аутом с помощью списка в памяти или как мне обойти это?