Search in sources :

Example 1 with DeadLetter

use of im.actor.runtime.actors.messages.DeadLetter in project actor-platform by actorapp.

the class ActorDispatcher method onActorDie.

private void onActorDie(ActorScope scope) {
    scope.onActorDie();
    if (scope.getProps().getSupervisor() != null) {
        scope.getProps().getSupervisor().onActorStopped(scope.getActorRef());
    }
    Envelope[] deadLetters;
    synchronized (LOCK) {
        scopes.remove(scope.getPath());
        endpoints.remove(scope.getPath());
        deadLetters = scope.getMailbox().dispose();
    }
    for (Envelope e : deadLetters) {
        if (e.getSender() != null) {
            e.getSender().send(new DeadLetter(e.getMessage()));
        }
    }
}
Also used : DeadLetter(im.actor.runtime.actors.messages.DeadLetter)

Example 2 with DeadLetter

use of im.actor.runtime.actors.messages.DeadLetter 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

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