У меня есть код, основанный на актерах, который делегирует некоторые операции аккорду akka, и я хотел бы ждать ответа этого актера бесконечно, я имею в виду, пока этот актер не вернет ответ за все время, которое требуется. Проблема в том, что я не знаю, как ждать бесконечно в будущем с помощью методов Pattern.ask и Await.result.
Я хотел бы что-то вроде этого:
Timeout timeout = new Timeout(Duration.inf());
Future<Object> future = Patterns.ask(actor, msg, timeout);
String result = (String) Await.result(future, timeout.duration());
но это не работает, потому что Timeout не принимает объект Duration в качестве параметра конструктора, он принимает только объекты EnditeDuration objetcs...
Есть идеи?
ура
Вы никогда не сможете получить ответ, так как доставка сообщений не гарантируется на 100%. Таким образом, ожидание на неопределенный срок не является хорошим подходом - вы вполне можете оказаться в ожидании навсегда.
Вероятно, вам нужен некоторый уровень таймаута (возможно, длинный, если он подходит), а затем резервный случай, когда вы повторно отправляете свой запрос по мере необходимости. Это будет более надежный способ справиться с этой ситуацией.
Отказ от ответственности: Я не очень опытен с Аккой.
Предложение: вы не можете отказаться от объекта Timeout и просто написать
Future<Object> future = Patterns.ask(actor, msg);
Await.result(f, Duration.Inf);
Либо это, либо использовать Timeout timeout = Timeout.never
Остерегайтесь, однако:
Таймаут с бесконечной продолжительностью. Никогда не будет тайм-аут. Будьте предельно осторожны с этим, так как это может вызвать утечку памяти, заблокированные потоки или даже не поддерживать приемник, что приведет к исключению. (из документа Akka API)
new TimeOut(Long.MAX_VALUE, TimeUnit.DAYS)
должен дать вам достаточно времени, чтобы умереть несколько раз.