Last active
June 23, 2016 13:20
-
-
Save matsu-chara/9fd2e37824f8681bcac4e23248332d34 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.concurrent.CountDownLatch | |
import akka.actor.SupervisorStrategy.{Restart, Resume, Stop} | |
import akka.actor._ | |
object Main extends App { | |
val system = ActorSystem() | |
try { | |
val actor = system.actorOf(Props[RootSupervisor]) | |
actor ! 1 | |
actor ! 2 | |
Thread.sleep(100) | |
actor ! 3 | |
} finally { | |
Thread.sleep(100) | |
system.shutdown() | |
} | |
} | |
class RootSupervisor extends Actor { | |
val actor = context.actorOf(Props[SupervisorExceptionActor]) | |
override def supervisorStrategy = OneForOneStrategy() { | |
case _: Exception ⇒ Restart | |
} | |
def receive = { | |
case x => actor forward x | |
} | |
} | |
class SupervisorExceptionActor extends Actor { | |
val actor = context.actorOf(Props[KilledActor]) | |
override def supervisorStrategy = OneForOneStrategy() { | |
case _: Exception ⇒ Restart | |
} | |
def receive = { | |
// case 2 => throw new RuntimeException("親が死んで子供をstop!") | |
case x => actor forward x | |
} | |
override def postStop() = { | |
super.postStop() | |
context.stop(actor) // preRestartでcontext.stopが呼ばれるので必要ないけどstop | |
} | |
} | |
class KilledActor extends Actor { | |
override def preStart() = { | |
super.preStart() | |
println("starting") | |
} | |
override def postStop() = { | |
super.postStop() | |
println("stopped") | |
} | |
override def preRestart(reason: Throwable, message: Option[Any]): Unit = { | |
super.preRestart(reason, message) | |
println("preRestart") | |
} | |
override def postRestart(reason: Throwable): Unit = { | |
super.postRestart(reason) | |
println("postRestart") | |
} | |
def receive = { | |
case 2 => throw new RuntimeException("") | |
case x => println(x) | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
starting | |
1 | |
stopped | |
preRestart | |
starting | |
postRestart | |
[ERROR] [06/23/2016 22:20:17.781] [default-akka.actor.default-dispatcher-2] [akka://default/user/$a/$a/$a] | |
java.lang.RuntimeException: | |
at KilledActor$$anonfun$receive$3.applyOrElse(HelloAkkaScala.scala:73) | |
at akka.actor.Actor$class.aroundReceive(Actor.scala:467) | |
at KilledActor.aroundReceive(HelloAkkaScala.scala:51) | |
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) | |
at akka.actor.ActorCell.invoke(ActorCell.scala:487) | |
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238) | |
at akka.dispatch.Mailbox.run(Mailbox.scala:220) | |
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) | |
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) | |
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) | |
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) | |
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) | |
3 | |
stopped | |
Process finished with exit code 0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
starting | |
1 | |
stopped | |
[ERROR] [06/23/2016 22:19:57.590] [default-akka.actor.default-dispatcher-2] [akka://default/user/$a/$a] 親が死んで子供をstop! | |
java.lang.RuntimeException: 親が死んで子供をstop! | |
at SupervisorExceptionActor$$anonfun$receive$2.applyOrElse(HelloAkkaScala.scala:40) | |
at akka.actor.Actor$class.aroundReceive(Actor.scala:467) | |
at SupervisorExceptionActor.aroundReceive(HelloAkkaScala.scala:32) | |
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) | |
at akka.actor.ActorCell.invoke(ActorCell.scala:487) | |
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238) | |
at akka.dispatch.Mailbox.run(Mailbox.scala:220) | |
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) | |
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) | |
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) | |
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) | |
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) | |
starting | |
3 | |
stopped | |
Process finished with exit code 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment