use of im.actor.runtime.actors.ActorScope in project actor-platform by actorapp.
the class ActorDispatcher method referenceActor.
public final ActorRef referenceActor(String path, Props props) {
synchronized (LOCK) {
if (scopes.containsKey(path)) {
return scopes.get(path).getActorRef();
}
Mailbox mailbox = new Mailbox(queueCollection);
ActorEndpoint endpoint = endpoints.get(path);
if (endpoint == null) {
endpoint = new ActorEndpoint(path);
endpoints.put(path, endpoint);
}
ActorScope scope = new ActorScope(actorSystem, mailbox, this, path, props, endpoint);
endpoint.connect(mailbox, scope);
scopes.put(scope.getPath(), scope);
// Sending init message
if (!Runtime.isSingleThread() && !Runtime.isMainThread()) {
scope.getActorRef().send(StartActor.INSTANCE);
} else {
Runtime.dispatch(() -> scope.getActorRef().send(StartActor.INSTANCE));
}
return scope.getActorRef();
}
}
use of im.actor.runtime.actors.ActorScope 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