Чтобы избежать OOM, я ограничиваю размер почтового ящика некоторых моих актеров Akka 1.1.3 общим пользовательским диспетчером.Например:
object Static {
val dispatcher = Dispatchers.newExecutorBasedEventDrivenWorkStealingDispatcher(
"customDispatcher",
1000,
BoundedMailbox(capacity = 10)
)
}
class MyActor extends Actor {
self.dispatcher = Static.dispatcher
...
}
Я бы хотел отреагировать на переполнение почтового ящика, чтобы я мог отправить сообщение вышестоящим производителям для приостановки (примечание: это выглядит так: actor.stop()
, подождите, и actor.start()
будетбросить ActorStartException
).Некоторая потеря данных допустима между заполнением очереди и ее разрядкой.
В главе Akka о Диспетчеры говорится
При попытке отправить сообщение наАктер выдаст исключение MessageQueueAppendFailedException («BlockingMessageTransferQueue timedout out»), если сообщение не может быть добавлено в почтовый ящик в течение времени, указанного в pushTimeout.
Где можно перехватить это исключение?
Документация звучит так, будто мне нужно обернуть каждую myActor ! message
в попытку / улов.Это правильно?Я действительно хотел бы централизовать его обработку.Может ли мой Supervisor
возможно перехватить его и запустить мой обработчик?