ルーターを使用してメッセージをワーカーアクターに転送する監視Akkaアクターがいます。
スーパーバイザーをラップするクラスがあり、そのクラスのメソッドを呼び出すと、スーパーバイザーに何かをするように「要求」しAwait.result(theFuture)
、結果を待つために使用します(結果なしでは続行できません)。
ワーカーが例外をスローした場合、例外をスローしたワーカーを再起動し、ラッパークラスを呼び出すコードによって例外がキャッチされるようにします。
をルーターコンストラクターに渡しました。ルーターコンストラクターは、の場合にOneForOneStrategy
返されます。ワーカーの方法では、再起動をログに記録するので、ワーカーが実際に再起動されたことを検証できます。RESTART
Exception
postRestart
ワーカーが例外をスローすると、ワーカーは再起動されますが、例外は消えます。Future
スーパーバイザーに問い合わせた結果であるこれには例外が含まれていますが、akka.pattern.AskTimeoutException
これは20秒ではなく、わずか5秒後にスローされます。これは、私が残している暗黙のタイムアウトです。例外は、実際にはワーカーの起動後1秒以内に発生します。
質問1:ラッパークラスを呼び出すコードでワーカーから例外を取得するにはどうすればよいですか?
また、ワーカーの受信メソッドは次のようになります。
def receive = {
case r: Request =>
val response = ??? //throws an exception sometimes
sender ! response
}
何かが例外をコンソールに記録していますが、それは私のコードではありません。スタックトレースは次のとおりです。
[ERROR] [02/11/2013 21:34:20.093] [MySystem-akka.actor.default-dispatcher-9]
[akka://MySystem/user/MySupervisor/MyRouter/$a] Something went wrong!
at myApp.Worker.$$anonfun$receive$1.applyOrElse(Source.scala:169)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:425)
at akka.actor.ActorCell.invoke(ActorCell.scala:386)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:230)
at akka.dispatch.Mailbox.run(Mailbox.scala:212)
at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:502)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:262)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1478)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
の169行目は、上記のメソッドのリストに示されてSource.scala
いる行です。val response = ???
receive
質問2:誰がその例外をコンソールに記録していますか?どうすればそれを止めることができますか?