2015-02-26 2 views
1

запланировать сообщение, используя scheduleOnce:Будет ли отправлено сообщение с расписанием, если указанный актер остановлен?

val cancellableMessage = system.schedule.scheduleOnce(500 milliseconds, self, "hi") 

Затем я запускаю метод, который, в конце его, делает это:

cancellableMessage.cancel() 
context.stop(self) 

Я видел вопросы планирования сообщений, которые периодически повторяются, например Akka Scala actor scheduled message does not appear to fire, в котором записана мертвая буква, потому что актер был остановлен. Но это были повторяющиеся сообщения. Смогу ли я по-прежнему видеть мертвую букву, если бы я использовал scheduleOnce вместо этого в порядке выше? Является ли Akka распознать это, так как я хотел сообщить сообщение self, а позже я остановился self, он не доставляет сообщение?

Я боюсь, что произойдет 500 миллисекунд, прежде чем я смогу правильно отменить его отправку (так как есть конкретный момент, когда я знаю, что, несмотря ни на что, я могу отменить его), но после ввода метод, который отменяет его, что приводит к мертвым буквам. Не катастрофа, но, конечно, неприятная.

ответ

3

Я считаю, что, поскольку планировщик выполнен на уровне ActorSystem, он не проверяет получателя сообщения. Вы можете себе представить, что ваш планировщик обертывает self ! "hi" внутри Runnable и просто передает бегун исполнителю, и он слепо выполняет это.

Итак, даже если ваш получатель мертв, сообщение будет отправлено в соответствующий ActorRef и закончится в DeadLetter.

+2

Спасибо. Это подтверждает то, что я видел, но я не был уверен, какие из моих тестов вызывали мертвую букву. – 2rs2ts

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