Hi Harit,

In the supervisionStrategy you can access "sender()" which will point to
the actor that is currently the target of the supervision decision. You can
use this to get the ActorRef of the actor you are going to restart. In
fact, you can change the state of the actor safely, just like in a normal
receive block.

-Endre

On Sun, May 31, 2015 at 1:17 AM, Harit Himanshu <
[email protected]> wrote:

> Requirement?
> - There has to be a long running process(daemon) that should run forever
> - In case of any exceptions, it should be restarted, but if it fails again
> twice, no restart efforts should be taken
>
> Problem I face?
> - The actor is restarted but no message sent again
> - As you can see, the message "I am a Marathon Runner!" is not printed
> again
>
> My code looks like
>
> *Main Class  *
>
>     package com.learner.ahka.runforever
>
>     import akka.actor.ActorSystem
>     import com.typesafe.config.ConfigFactory
>
>     object RaceEvent extends App {
>       val config = ConfigFactory.parseString( """
>         akka.loglevel = "DEBUG"
>         akka.actor.debug {
>           receive = on
>           lifecycle = on
>         }
>                                               """)
>       val system = ActorSystem.create("race", config)
>       val coach = system.actorOf(Coach.props(), "coach")
>       coach ! GetSetGo
>     }
>
> *Supervisor*
>
>     package com.learner.ahka.runforever
>
>     import akka.actor.SupervisorStrategy.{Escalate, Restart}
>     import akka.actor._
>     import akka.event.LoggingReceive
>
>     import scala.concurrent.duration._
>
>     case object GetSetGo
>
>     object Coach {
>       def props(): Props = Props[Coach];
>     }
>
>     class Coach() extends Actor with ActorLogging {
>
>       val runner = context.actorOf(Runner.props(new Marathon), "runner")
>
>       override def supervisorStrategy: SupervisorStrategy =
> OneForOneStrategy(maxNrOfRetries = 2, withinTimeRange = 5 seconds) {
>         case _: RuntimeException => Restart
>       }
>
>       override def receive = LoggingReceive {
>         case GetSetGo => runner ! GoForIt
>       }
>     }
>
> *Actor*
>
>     package com.learner.ahka.runforever
>
>     import akka.actor.Status.Failure
>     import akka.actor.{Actor, ActorLogging, Props}
>     import akka.event.LoggingReceive
>     import akka.pattern.pipe
>
>     object Runner {
>       def props(race: Race) = Props(classOf[Runner], race)
>     }
>
>     class Runner(race: Race) extends Actor with ActorLogging {
>
>       import context.dispatcher
>
>       override def receive: Receive = LoggingReceive {
>         case GoForIt => race.start pipeTo self
>         case Failure(throwable) => throw throwable
>       }
>     }
>
> *Actual work*
>
>     package com.learner.ahka.runforever
>
>     import scala.concurrent.Future
>
>     case object GoForIt
>
>     trait Race {
>       def start: Future[Any]
>     }
>
>     class Marathon extends Race {
>
>       import scala.concurrent.ExecutionContext.Implicits.global
>
>       override def start: Future[Any] = future
>
>       val future = Future {
>         for (i <- 1 to 3) {
>           println("I am a Marathon Runner!")
>           Thread.sleep(1000)
>         }
>         throw new RuntimeException("MarathonRunner is tired")
>       }
>     }
>
> *Logs*
>
>     [DEBUG] [05/30/2015 16:03:35.696] [main] [EventStream(akka://race)]
> logger log1-Logging$DefaultLogger started
>     [DEBUG] [05/30/2015 16:03:35.698] [main] [EventStream(akka://race)]
> Default Loggers started
>     [DEBUG] [05/30/2015 16:03:35.704]
> [race-akka.actor.default-dispatcher-4] [akka://race/system] now supervising
> Actor[akka://race/system/deadLetterListener#-1391310385]
>     [DEBUG] [05/30/2015 16:03:35.706]
> [race-akka.actor.default-dispatcher-3]
> [akka://race/system/deadLetterListener] started
> (akka.event.DeadLetterListener@191ba186)
>     [DEBUG] [05/30/2015 16:03:35.710]
> [race-akka.actor.default-dispatcher-2] [akka://race/user] now supervising
> Actor[akka://race/user/coach#-1161587711]
>     I am a Marathon Runner!
>     [DEBUG] [05/30/2015 16:03:35.722]
> [race-akka.actor.default-dispatcher-3] [akka://race/user/coach] started
> (com.learner.ahka.runforever.Coach@66f0f319)
>     [DEBUG] [05/30/2015 16:03:35.722]
> [race-akka.actor.default-dispatcher-4] [akka://race/user/coach/runner]
> started (com.learner.ahka.runforever.Runner@72f67980)
>     [DEBUG] [05/30/2015 16:03:35.723]
> [race-akka.actor.default-dispatcher-3] [akka://race/user/coach] now
> supervising Actor[akka://race/user/coach/runner#755574648]
>     [DEBUG] [05/30/2015 16:03:35.723]
> [race-akka.actor.default-dispatcher-3] [akka://race/user/coach] received
> handled message GetSetGo
>     [DEBUG] [05/30/2015 16:03:35.725]
> [race-akka.actor.default-dispatcher-4] [akka://race/user/coach/runner]
> received handled message GoForIt
>     I am a Marathon Runner!
>     I am a Marathon Runner!
>     [DEBUG] [05/30/2015 16:03:38.739]
> [race-akka.actor.default-dispatcher-3] [akka://race/user/coach/runner]
> received handled message Failure(java.lang.RuntimeException: MarathonRunner
> is tired)
>     [ERROR] [05/30/2015 16:03:38.752]
> [race-akka.actor.default-dispatcher-4] [akka://race/user/coach/runner]
> MarathonRunner is tired
>     java.lang.RuntimeException: MarathonRunner is tired
>     at
> com.learner.ahka.runforever.Marathon$$anonfun$1.apply(Race.scala:22)
>     at
> com.learner.ahka.runforever.Marathon$$anonfun$1.apply(Race.scala:17)
>     at
> scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
>     at
> scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
>     at
> scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
>     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)
>
>     [DEBUG] [05/30/2015 16:03:38.753]
> [race-akka.actor.default-dispatcher-2] [akka://race/user/coach/runner]
> restarting
>     [DEBUG] [05/30/2015 16:03:38.755]
> [race-akka.actor.default-dispatcher-2] [akka://race/user/coach/runner]
> restarted
>
> Can someone please spot what I am missing?
>
> Thank you
>
>  --
> >>>>>>>>>> Read the docs: http://akka.io/docs/
> >>>>>>>>>> Check the FAQ:
> http://doc.akka.io/docs/akka/current/additional/faq.html
> >>>>>>>>>> Search the archives: https://groups.google.com/group/akka-user
> ---
> You received this message because you are subscribed to the Google Groups
> "Akka User List" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/akka-user.
> For more options, visit https://groups.google.com/d/optout.
>



-- 
Akka Team
Typesafe - Reactive apps on the JVM
Blog: letitcrash.com
Twitter: @akkateam

-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: 
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to