Ответ 1
Позвольте мне сначала ответить на вопрос заголовка: да, можно использовать планировщик внутри актера.
case Sleep(duration) =>
context.system.scheduler.scheduleOnce(duration, self, Ring)
Теперь на вопрос, стоящий за вопросом
Вы не сказали то, что вы на самом деле хотите достичь, поэтому я делаю обоснованное предположение, что вы хотите, чтобы актер, который обычно делает что-то под названием "X", некоторое время называл "Y", X ". Полные решения этого были бы
class Sleepy extends Actor {
def receive = {
... // cases doing "X"
case Sleep(duration) =>
case object WakeUp
context.system.scheduler.scheduleOnce(duration, self, WakeUp)
context.become({
case WakeUp => context.unbecome()
// drop the rest
}, discardOld = false)
}
}
То же самое можно было бы реализовать с использованием признака FSM и переключения между нормальным и спящим состоянием. И, конечно же, вы можете делать все, что хотите, во время сна, например. смешайте в Stash
в Akka 2.1 и вызовите stash()
для всех (или некоторых) сообщений во время сна, unstashAll()
при получении сообщения WakeUp
; или вы могли бы сделать что-то еще совсем. Актеры очень гибкие.
Какие актеры не делают
Актеры никогда не спят, они всегда обрабатывают входящие сообщения. Как показано выше, вы можете определить, что это значит, но основным принципом является то, что вы не можете приостановить действие актера, чтобы он не обрабатывал сообщения в своем почтовом ящике.