Короткий ответ заключается в том, что вы не можете. Как только он начнет обрабатывать его, отправка Kill или Poison Pill или его остановка предотвратит его обработку только будущих сообщений. Долгий ответ заключается в том, что, возможно, вы можете взломать это, если актер оказался в какой-то петле и проверил некоторый изменяемый (и потенциально глобально доступный) сигнал для остановки цикла, но есть так много красных флагов с таким подходом, что вы должны забыть, что я даже упомянул об этом. И если длинный вызов оказался блокирующим звонком на что-то вроде БД, забудьте об этом; вы застреваете до тех пор, пока этот вызов не завершится (или не пройдет время, если вам повезет).
Сам актер не знает, что кто-то назвал его через ask
, и есть Future
вверх по течению, что может закончиться тайм-аутом. Он не имеет понятия об этом и, следовательно, не может реагировать соответственно, когда это Future
раз.
Да, длинный вызов на самом деле является блокирующим вызовом к db. Наверное, я мог бы обернуть вызов db в другое «будущее» с тайм-аутом и обработать исключение тайм-аута. – vikraman
@ vh4x0r, это, наверное, хорошая идея. Вы также должны рассмотреть возможность переноса кода в «Будущее» в блок блокировки, поэтому контекст выполнения знает, что это блокирующий вызов и обрабатывает его соответствующим образом. Кроме того, вы можете использовать отдельный «ExecutionContext» для этих блокирующих вызовов ввода-вывода, чтобы резервная копия не окажет негативного влияния на главного диспетчера вашей системы Akka. – cmbaxter