2013-07-18 2 views
0

Я использую шаблон запроса с таймаутом для отправки сообщения моему актеру, что может потребовать много времени для его обработки. Я хочу прекратить обработку сообщения, если истечет время ожидания. Но, кажется, актер продолжает обрабатывать сообщение, и я получаю мертвое письмо.Обработка сообщения о прекращении действия агента при тайм-ауте

Как я могу остановить актера от обработки сообщения по истечении времени ожидания?

ответ

3

Короткий ответ заключается в том, что вы не можете. Как только он начнет обрабатывать его, отправка Kill или Poison Pill или его остановка предотвратит его обработку только будущих сообщений. Долгий ответ заключается в том, что, возможно, вы можете взломать это, если актер оказался в какой-то петле и проверил некоторый изменяемый (и потенциально глобально доступный) сигнал для остановки цикла, но есть так много красных флагов с таким подходом, что вы должны забыть, что я даже упомянул об этом. И если длинный вызов оказался блокирующим звонком на что-то вроде БД, забудьте об этом; вы застреваете до тех пор, пока этот вызов не завершится (или не пройдет время, если вам повезет).

Сам актер не знает, что кто-то назвал его через ask, и есть Future вверх по течению, что может закончиться тайм-аутом. Он не имеет понятия об этом и, следовательно, не может реагировать соответственно, когда это Future раз.

+0

Да, длинный вызов на самом деле является блокирующим вызовом к db. Наверное, я мог бы обернуть вызов db в другое «будущее» с тайм-аутом и обработать исключение тайм-аута. – vikraman

+2

@ vh4x0r, это, наверное, хорошая идея. Вы также должны рассмотреть возможность переноса кода в «Будущее» в блок блокировки, поэтому контекст выполнения знает, что это блокирующий вызов и обрабатывает его соответствующим образом. Кроме того, вы можете использовать отдельный «ExecutionContext» для этих блокирующих вызовов ввода-вывода, чтобы резервная копия не окажет негативного влияния на главного диспетчера вашей системы Akka. – cmbaxter

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