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