Search in sources :

Example 1 with ActorScope

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();
    }
}
Also used : ActorScope(im.actor.runtime.actors.ActorScope)

Example 2 with ActorScope

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);
        }
    }
}
Also used : DeadLetter(im.actor.runtime.actors.messages.DeadLetter) StartActor(im.actor.runtime.actors.messages.StartActor) Actor(im.actor.runtime.actors.Actor) ActorScope(im.actor.runtime.actors.ActorScope) ActorContext(im.actor.runtime.actors.ActorContext)

Aggregations

ActorScope (im.actor.runtime.actors.ActorScope)2 Actor (im.actor.runtime.actors.Actor)1 ActorContext (im.actor.runtime.actors.ActorContext)1 DeadLetter (im.actor.runtime.actors.messages.DeadLetter)1 StartActor (im.actor.runtime.actors.messages.StartActor)1