Skip to content

Instantly share code, notes, and snippets.

@matsu-chara
Last active June 23, 2016 13:20
Show Gist options
  • Save matsu-chara/9fd2e37824f8681bcac4e23248332d34 to your computer and use it in GitHub Desktop.
Save matsu-chara/9fd2e37824f8681bcac4e23248332d34 to your computer and use it in GitHub Desktop.
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)
}
}
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
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