ticofab
ticofab

Reputation: 7717

Check if a Scala / Akka actor is terminated

While executing code within one actor, I need to check if the actor is still alive. Would this be advisable or is there a better way?

if (self != akka.actor.DeadLetter) {
  // do something
}

Thanks!

EDIT---

Thanks for all your inputs. What happens is the following. I am using Play. As my actor starts, upon an incoming request, a timeout is scheduled.

Promise.timeout({
     Logger.info(s"$self, timeout expired")
     // do something
}, timeoutValue)

Sometimes the actor is stopped for other reasons before the timeout expires (for instance, the client disconnects). In that case, what I see then in the logs is

Actor[akka://application/deadLetters], timeout expired.

To my understanding, this means that the default deadLetters actor is executing that code. So my question really is: what is the best way to check if the Promise code is executed after the actor is terminated, and prevent it from going further if that is the case?

Upvotes: 9

Views: 10519

Answers (3)

Endre Varga
Endre Varga

Reputation: 1863

You should familiarize yourself with the actor lifecycle: http://doc.akka.io/docs/akka/2.3.4/scala/actors.html#Actor_Lifecycle

From inside an actor you can implement the postStop() callback that will be called immediately before your actor is going to be stopped. If you want to monitor the lifecycle of the actor from another actor you should use DeathWatch: http://doc.akka.io/docs/akka/2.3.4/scala/actors.html#Lifecycle_Monitoring_aka_DeathWatch

Upvotes: 4

Ashalynd
Ashalynd

Reputation: 12573

If your actor is dead, no code within the actor will be running.

You can check if specific actor is available, with actorSelection, and then send a message to whatever is returned as a result (if there will be nothing, no message will be sent).

ActorContext.actorSelection(<your-actor-name>) ! someMessage

Upvotes: 1

chalimartines
chalimartines

Reputation: 5653

I think you can watch your actor and if you receive message Terminated you are sure that your actor is not running.

ActorContext.watch(self)

Upvotes: 1

Related Questions