use of im.actor.runtime.actors.ActorContext in project actor-platform by actorapp.
the class ActorDispatcher method processEnvelope.
/**
* Processing of envelope
*
* @param envelope envelope
*/
private void processEnvelope(Envelope envelope) {
ActorScope scope = envelope.getScope();
if (actorSystem.getTraceInterface() != null) {
actorSystem.getTraceInterface().onEnvelopeDelivered(envelope);
}
long start = ActorTime.currentTime();
if (scope.getActor() == null) {
if (envelope.getMessage() == PoisonPill.INSTANCE) {
// Not creating actor for PoisonPill
return;
}
try {
Actor actor = scope.getProps().create();
actor.initActor(scope.getPath(), new ActorContext(scope), scope.getMailbox());
ThreadDispatcher.pushDispatcher(actor.getDispatcher());
try {
actor.preStart();
} finally {
ThreadDispatcher.popDispatcher();
}
scope.onActorCreated(actor);
} catch (Exception e) {
e.printStackTrace();
if (envelope.getSender() != null) {
envelope.getSender().send(new DeadLetter("Unable to create actor"));
}
return;
}
}
try {
if (envelope.getMessage() == StartActor.INSTANCE) {
// Already created actor
} else if (envelope.getMessage() == PoisonPill.INSTANCE) {
ThreadDispatcher.pushDispatcher(scope.getActor().getDispatcher());
try {
scope.getActor().postStop();
} finally {
ThreadDispatcher.popDispatcher();
}
onActorDie(scope);
} else {
scope.getActor().handleMessage(envelope.getMessage(), envelope.getSender());
}
} catch (Exception e) {
if (actorSystem.getTraceInterface() != null) {
actorSystem.getTraceInterface().onActorDie(scope.getActorRef(), envelope, e);
}
ThreadDispatcher.pushDispatcher(scope.getActor().getDispatcher());
try {
scope.getActor().postStop();
} finally {
ThreadDispatcher.popDispatcher();
}
onActorDie(scope);
} finally {
if (actorSystem.getTraceInterface() != null) {
actorSystem.getTraceInterface().onEnvelopeProcessed(envelope, ActorTime.currentTime() - start);
}
}
}
Aggregations