2014-10-01 2 views
1

У меня есть код, не содержащий актера, который делегирует некоторые действия аккорду акки, и я хотел бы ждать ответа этого актера бесконечно, я имею в виду, пока этот актер возвращает ответ в любое время. Проблема в том, что я не знаю, как ждать бесконечно в будущем с помощью методов Pattern.ask и Await.result.Подождите ответа актера на неопределенный срок в будущем akka java

я бы что-то вроде этого:

Timeout timeout = new Timeout(Duration.inf()); 
Future<Object> future = Patterns.ask(actor, msg, timeout); 
String result = (String) Await.result(future, timeout.duration()); 

, но это не работает, потому что тайм-аута не принимает объект Duration в качестве параметра конструктора, он принимает только FiniteDuration objetcs ...

Любая идея?

Приветствия

ответ

6

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

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

+0

FiniteDuration исполняется по уважительным причинам. Но, как было предложено, '' новый TimeOut (Long.MAX_VALUE, TimeUnit.DAYS) '' должен дать вам достаточно времени, чтобы умереть несколько раз. –

+0

Вы не можете переждать время больше, чем 292 года, иначе вы получите IllegalArgumentException: требование не выполнено: продолжительность обучения ограничена 292 годами. Я думаю, вы можете пройти только максимум 21474835 секунд. – Ravi

+0

@Ravi пока правильно, что максимум 21474835 секунд, это всего лишь 248 дней (а не лет). – kap

-1

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

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

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

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

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

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

+0

Это невозможно. Вы видели [akka.pattern.Patterns API] (http://doc.akka.io/api/akka/2.3.6/index.html#akka.pattern.Patterns$)? – cs4r

+0

Я еще не использовал его. У меня создалось впечатление, что поскольку gracefulStop специально запрашивает FiniteDuration, в то время как ask только ожидает Timeout, вы можете использовать Timeout.never. Я могу ошибаться (отсюда и мое заявление об отказе). – Sycomor

+0

Таймаут не имеет метода или члена, который никогда не называется. Спасибо за вашу заинтересованность в решении моей проблемы, но ваш ответ полностью неверен. – cs4r

Смежные вопросы