package org.opendaylight.controller.cluster.common.actor;
-import akka.actor.UntypedActor;
-import akka.event.Logging;
-import akka.event.LoggingAdapter;
+import akka.actor.AbstractActor;
+import akka.actor.ActorRef;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.eclipse.jdt.annotation.NonNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-public abstract class AbstractUntypedActor extends UntypedActor {
- protected final LoggingAdapter LOG =
- Logging.getLogger(getContext().system(), this);
+public abstract class AbstractUntypedActor extends AbstractActor implements ExecuteInSelfActor {
+ // The member name should be lower case but it's referenced in many subclasses. Suppressing the CS warning for now.
+ @SuppressFBWarnings("SLF4J_LOGGER_SHOULD_BE_PRIVATE")
+ @SuppressWarnings("checkstyle:MemberName")
+ protected final Logger LOG = LoggerFactory.getLogger(getClass());
- public AbstractUntypedActor() {
+ protected AbstractUntypedActor() {
LOG.debug("Actor created {}", getSelf());
- getContext().
- system().
- actorSelection("user/termination-monitor").
- tell(new Monitor(getSelf()), getSelf());
-
+ getContext().system().actorSelection("user/termination-monitor").tell(new Monitor(getSelf()), getSelf());
}
- @Override public void onReceive(Object message) throws Exception {
- final String messageType = message.getClass().getSimpleName();
- LOG.debug("Received message {}", messageType);
-
- handleReceive(message);
+ @Override
+ public final void executeInSelf(@NonNull final Runnable runnable) {
+ final ExecuteInSelfMessage message = new ExecuteInSelfMessage(runnable);
+ self().tell(message, ActorRef.noSender());
+ }
- LOG.debug("Done handling message {}", messageType);
+ @Override
+ public Receive createReceive() {
+ return receiveBuilder()
+ .match(ExecuteInSelfMessage.class, ExecuteInSelfMessage::run)
+ .matchAny(this::handleReceive)
+ .build();
}
- protected abstract void handleReceive(Object message) throws Exception;
+ /**
+ * Receive and handle an incoming message. If the implementation does not handle this particular message,
+ * it should call {@link #ignoreMessage(Object)} or {@link #unknownMessage(Object)}.
+ *
+ * @param message the incoming message
+ */
+ protected abstract void handleReceive(Object message);
- protected void ignoreMessage(Object message) {
- LOG.debug("Unhandled message {} ", message);
+ protected final void ignoreMessage(final Object message) {
+ LOG.debug("Ignoring unhandled message {}", message);
}
- protected void unknownMessage(Object message) throws Exception {
+ protected final void unknownMessage(final Object message) {
LOG.debug("Received unhandled message {}", message);
unhandled(message);
}
+
+ protected boolean isValidSender(final ActorRef sender) {
+ // If the caller passes in a null sender (ActorRef.noSender()), akka translates that to the
+ // deadLetters actor.
+ return sender != null && !getContext().system().deadLetters().equals(sender);
+ }
}