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の章は言う
アクターにメッセージを送信しようとすると、pushTimeout で指定された時間内にメッセージをメールボックスに追加できない場合、MessageQueueAppendFailedException(“BlockingMessageTransferQueue transfer timed out”) がスローされます。
この例外はどこでキャッチできますか?
myActor ! message
ドキュメントでは、try/catch ですべてをラップする必要があるように聞こえます。そうですか?取り扱いを一元化したいと思います。Supervisor
おそらくそれを傍受してハンドラーを実行できますか?