From 4cc29da89e04648d9b5a7647613f8fadad931782 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 19 Feb 2019 15:58:28 +0100 Subject: [PATCH] Migrate to AbstractActor UntypedActor has been deprecated, this patch migrates to using AbstractActor so we eliminate a slew of deprecatation warnings. Change-Id: I4e3274ce92d5f68df1937f91f823eed905da4d6c Signed-off-by: Robert Varga Signed-off-by: Ajay Lele --- .../cluster/PersistentDataProvider.java | 11 ++-- .../common/actor/AbstractUntypedActor.java | 15 +++-- .../actor/AbstractUntypedPersistentActor.java | 29 +++------ .../common/actor/MeteringBehavior.java | 60 +++++++------------ 4 files changed, 45 insertions(+), 70 deletions(-) diff --git a/java/org/opendaylight/controller/cluster/PersistentDataProvider.java b/java/org/opendaylight/controller/cluster/PersistentDataProvider.java index 1d676fa4a6..21102f1f0e 100644 --- a/java/org/opendaylight/controller/cluster/PersistentDataProvider.java +++ b/java/org/opendaylight/controller/cluster/PersistentDataProvider.java @@ -7,20 +7,21 @@ */ package org.opendaylight.controller.cluster; +import static java.util.Objects.requireNonNull; + import akka.japi.Procedure; +import akka.persistence.AbstractPersistentActor; import akka.persistence.SnapshotSelectionCriteria; -import akka.persistence.UntypedPersistentActor; -import com.google.common.base.Preconditions; /** * A DataPersistenceProvider implementation with persistence enabled. */ public class PersistentDataProvider implements DataPersistenceProvider { - private final UntypedPersistentActor persistentActor; + private final AbstractPersistentActor persistentActor; - public PersistentDataProvider(UntypedPersistentActor persistentActor) { - this.persistentActor = Preconditions.checkNotNull(persistentActor, "persistentActor can't be null"); + public PersistentDataProvider(AbstractPersistentActor persistentActor) { + this.persistentActor = requireNonNull(persistentActor, "persistentActor can't be null"); } @Override diff --git a/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedActor.java b/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedActor.java index c0e260ae66..6af52fbd04 100644 --- a/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedActor.java +++ b/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedActor.java @@ -8,14 +8,14 @@ package org.opendaylight.controller.cluster.common.actor; +import akka.actor.AbstractActor; import akka.actor.ActorRef; -import akka.actor.UntypedActor; 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 implements ExecuteInSelfActor { +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") @@ -33,12 +33,11 @@ public abstract class AbstractUntypedActor extends UntypedActor implements Execu } @Override - public final void onReceive(final Object message) { - if (message instanceof ExecuteInSelfMessage) { - ((ExecuteInSelfMessage) message).run(); - } else { - handleReceive(message); - } + public Receive createReceive() { + return receiveBuilder() + .match(ExecuteInSelfMessage.class, ExecuteInSelfMessage::run) + .matchAny(this::handleReceive) + .build(); } /** diff --git a/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedPersistentActor.java b/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedPersistentActor.java index 5ee3c49988..711a43159a 100644 --- a/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedPersistentActor.java +++ b/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedPersistentActor.java @@ -5,17 +5,16 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.controller.cluster.common.actor; import akka.actor.ActorRef; -import akka.persistence.UntypedPersistentActor; +import akka.persistence.AbstractPersistentActor; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.eclipse.jdt.annotation.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class AbstractUntypedPersistentActor extends UntypedPersistentActor implements ExecuteInSelfActor { +public abstract class AbstractUntypedPersistentActor extends AbstractPersistentActor 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") @@ -35,26 +34,16 @@ public abstract class AbstractUntypedPersistentActor extends UntypedPersistentAc } @Override - public final void onReceiveCommand(final Object message) throws Exception { - final String messageType = message.getClass().getSimpleName(); - LOG.trace("Received message {}", messageType); - - if (message instanceof ExecuteInSelfMessage) { - LOG.trace("Executing {}", message); - ((ExecuteInSelfMessage) message).run(); - } else { - handleCommand(message); - } - - LOG.trace("Done handling message {}", messageType); + public final Receive createReceive() { + return receiveBuilder() + .match(ExecuteInSelfMessage.class, ExecuteInSelfMessage::run) + .matchAny(this::handleCommand) + .build(); } @Override - public final void onReceiveRecover(final Object message) throws Exception { - final String messageType = message.getClass().getSimpleName(); - LOG.trace("Received message {}", messageType); - handleRecover(message); - LOG.trace("Done handling message {}", messageType); + public final Receive createReceiveRecover() { + return receiveBuilder().matchAny(this::handleRecover).build(); } protected abstract void handleRecover(Object message) throws Exception; diff --git a/java/org/opendaylight/controller/cluster/common/actor/MeteringBehavior.java b/java/org/opendaylight/controller/cluster/common/actor/MeteringBehavior.java index 63958912c4..a49bc30427 100644 --- a/java/org/opendaylight/controller/cluster/common/actor/MeteringBehavior.java +++ b/java/org/opendaylight/controller/cluster/common/actor/MeteringBehavior.java @@ -7,13 +7,13 @@ */ package org.opendaylight.controller.cluster.common.actor; -import akka.actor.UntypedActor; -import akka.japi.Procedure; +import akka.actor.AbstractActor; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Timer; -import com.google.common.base.Preconditions; -import com.google.common.base.Throwables; import org.opendaylight.controller.cluster.reporting.MetricsReporter; +import scala.PartialFunction; +import scala.runtime.AbstractPartialFunction; +import scala.runtime.BoxedUnit; /** * Represents behaviour that can be exhibited by actors of type {@link akka.actor.UntypedActor} @@ -26,17 +26,21 @@ import org.opendaylight.controller.cluster.reporting.MetricsReporter; * * The information is reported to {@link org.opendaylight.controller.cluster.reporting.MetricsReporter} */ -public class MeteringBehavior implements Procedure { +public class MeteringBehavior extends AbstractPartialFunction { public static final String DOMAIN = "org.opendaylight.controller.actor.metric"; private static final String MSG_PROCESSING_RATE = "msg-rate"; - private final UntypedActor meteredActor; - private final MetricRegistry metricRegistry = MetricsReporter.getInstance(DOMAIN).getMetricsRegistry(); - - private String actorQualifiedName; - private Timer msgProcessingTimer; + private final String actorQualifiedName; + private final Timer msgProcessingTimer; + private final PartialFunction receive; + + private MeteringBehavior(final String actorName, final AbstractActor meteredActor) { + actorQualifiedName = meteredActor.getSelf().path().parent().toStringWithoutAddress() + "/" + actorName; + msgProcessingTimer = metricRegistry.timer(MetricRegistry.name(actorQualifiedName, MSG_PROCESSING_RATE)); + receive = meteredActor.createReceive().onMessage(); + } /** * Constructs an instance. @@ -44,28 +48,17 @@ public class MeteringBehavior implements Procedure { * @param actor whose behaviour needs to be metered */ public MeteringBehavior(final AbstractUntypedActorWithMetering actor) { - Preconditions.checkArgument(actor != null, "actor must not be null"); - this.meteredActor = actor; - - String actorName = actor.getActorNameOverride() != null ? actor.getActorNameOverride() - : actor.getSelf().path().name(); - init(actorName); + this(actor.getActorNameOverride() != null ? actor.getActorNameOverride() : actor.getSelf().path().name(), + actor); } - public MeteringBehavior(final UntypedActor actor) { - Preconditions.checkArgument(actor != null, "actor must not be null"); - this.meteredActor = actor; - - String actorName = actor.getSelf().path().name(); - init(actorName); + public MeteringBehavior(final AbstractActor actor) { + this(actor.getSelf().path().name(), actor); } - private void init(final String actorName) { - actorQualifiedName = meteredActor.getSelf().path().parent().toStringWithoutAddress() - + "/" + actorName; - - final String msgProcessingTime = MetricRegistry.name(actorQualifiedName, MSG_PROCESSING_RATE); - msgProcessingTimer = metricRegistry.timer(msgProcessingTime); + @Override + public boolean isDefinedAt(final Object obj) { + return receive.isDefinedAt(obj); } /** @@ -84,16 +77,12 @@ public class MeteringBehavior implements Procedure { * http://dropwizard.github.io/metrics/manual/core/#timers * * @param message the message to process - * @throws Exception on message failure */ - @SuppressWarnings("checkstyle:IllegalCatch") @Override - public void apply(final Object message) throws Exception { + public BoxedUnit apply(Object message) { final String messageType = message.getClass().getSimpleName(); - final String msgProcessingTimeByMsgType = MetricRegistry.name(actorQualifiedName, MSG_PROCESSING_RATE, messageType); - final Timer msgProcessingTimerByMsgType = metricRegistry.timer(msgProcessingTimeByMsgType); //start timers @@ -101,10 +90,7 @@ public class MeteringBehavior implements Procedure { final Timer.Context contextByMsgType = msgProcessingTimerByMsgType.time(); try { - meteredActor.onReceive(message); - } catch (Throwable e) { - Throwables.propagateIfPossible(e, Exception.class); - throw new RuntimeException(e); + return receive.apply(message); } finally { //stop timers contextByMsgType.stop(); -- 2.36.6