Ждите ответа актера неопределенно в будущем akka java

1

У меня есть код, основанный на актерах, который делегирует некоторые операции аккорду 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...

Есть идеи?

ура

Теги:
multithreading
akka

2 ответа

6

Вы никогда не сможете получить ответ, так как доставка сообщений не гарантируется на 100%. Таким образом, ожидание на неопределенный срок не является хорошим подходом - вы вполне можете оказаться в ожидании навсегда.

Вероятно, вам нужен некоторый уровень таймаута (возможно, длинный, если он подходит), а затем резервный случай, когда вы повторно отправляете свой запрос по мере необходимости. Это будет более надежный способ справиться с этой ситуацией.

  • 0
    FiniteDuration применяется по уважительным причинам. Но, как и предполагалось, new TimeOut(Long.MAX_VALUE, TimeUnit.DAYS) должен дать вам достаточно времени, чтобы умереть несколько раз.
  • 0
    Время ожидания не может превышать 292 года, в противном случае вы получите IllegalArgumentException: требование не выполнено: продолжительность ограничена 292 годами. Я думаю, что вы можете пройти только 21474835 секунд максимум.
Показать ещё 1 комментарий
-1

Отказ от ответственности: Я не очень опытен с Аккой.

Предложение: вы не можете отказаться от объекта Timeout и просто написать

Future<Object> future = Patterns.ask(actor, msg);
Await.result(f, Duration.Inf);

Либо это, либо использовать Timeout timeout = Timeout.never

Остерегайтесь, однако:

Таймаут с бесконечной продолжительностью. Никогда не будет тайм-аут. Будьте предельно осторожны с этим, так как это может вызвать утечку памяти, заблокированные потоки или даже не поддерживать приемник, что приведет к исключению. (из документа Akka API)

  • 0
    Это не может быть сделано. Вы видели API akka.pattern.Patterns ?
  • 0
    Я еще не использовал его. У меня сложилось впечатление, что, поскольку gracefulStop специально запрашивает FiniteDuration, а ask ожидает только Timeout, вы можете использовать Timeout.never. Я могу ошибаться (отсюда и мой отказ от ответственности).
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню