import akka.actor.ActorContext;
import akka.actor.ActorRef;
-import javax.annotation.concurrent.NotThreadSafe;
-import org.opendaylight.controller.cluster.datastore.utils.Dispatchers;
+import akka.actor.Props;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.opendaylight.controller.cluster.common.actor.Dispatchers;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Abstract base class for a ShardDataTreeNotificationPublisher that offloads the generation and publication
- * of data tree notifications to an actor.
+ * of data tree notifications to an actor. This class is NOT thread-safe.
*
* @author Thomas Pantelis
*/
-@NotThreadSafe
abstract class AbstractShardDataTreeNotificationPublisherActorProxy implements ShardDataTreeNotificationPublisher {
- private static final Logger LOG = LoggerFactory.getLogger(AbstractShardDataTreeNotificationPublisherActorProxy.class);
+ @SuppressFBWarnings("SLF4J_LOGGER_SHOULD_BE_PRIVATE")
+ protected final Logger log = LoggerFactory.getLogger(getClass());
private final ActorContext actorContext;
private final String actorName;
- private ActorRef notifierActor;
+ private final String logContext;
+ private ActorRef publisherActor;
- protected AbstractShardDataTreeNotificationPublisherActorProxy(ActorContext actorContext, String actorName) {
+ protected AbstractShardDataTreeNotificationPublisherActorProxy(final ActorContext actorContext,
+ final String actorName, final String logContext) {
this.actorContext = actorContext;
this.actorName = actorName;
+ this.logContext = logContext;
}
- protected AbstractShardDataTreeNotificationPublisherActorProxy(
- AbstractShardDataTreeNotificationPublisherActorProxy other) {
- this.actorContext = null;
- this.actorName = null;
- this.notifierActor = other.getNotifierActor();
+ protected abstract Props props();
+
+ protected final String actorName() {
+ return actorName;
}
- protected abstract ShardDataTreeNotificationPublisher getDelegatePublisher();
+ protected final String logContext() {
+ return logContext;
+ }
@Override
- public void publishChanges(DataTreeCandidate candidate, String logContext) {
- getNotifierActor().tell(new ShardDataTreeNotificationPublisherActor.PublishNotifications(
- getDelegatePublisher(), candidate, logContext), ActorRef.noSender());
+ public void publishChanges(final DataTreeCandidate candidate) {
+ publisherActor().tell(new ShardDataTreeNotificationPublisherActor.PublishNotifications(candidate),
+ ActorRef.noSender());
}
- private ActorRef getNotifierActor() {
- if(notifierActor == null) {
- LOG.debug("Creating actor {}", actorName);
-
+ protected final ActorRef publisherActor() {
+ if (publisherActor == null) {
String dispatcher = new Dispatchers(actorContext.system().dispatchers()).getDispatcherPath(
Dispatchers.DispatcherType.Notification);
- notifierActor = actorContext.actorOf(ShardDataTreeNotificationPublisherActor.props(actorName)
- .withDispatcher(dispatcher).withMailbox(
- org.opendaylight.controller.cluster.datastore.utils.ActorContext.BOUNDED_MAILBOX), actorName);
+ publisherActor = actorContext.actorOf(props().withDispatcher(dispatcher), actorName);
+
+ log.debug("{}: Created publisher actor {} with name {}", logContext, publisherActor, actorName);
}
- return notifierActor;
+ return publisherActor;
}
}