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 <robert.varga@pantheon.tech>
Signed-off-by: Ajay Lele <ajayslele@gmail.com>
*/
package org.opendaylight.controller.cluster;
*/
package org.opendaylight.controller.cluster;
+import static java.util.Objects.requireNonNull;
+
import akka.japi.Procedure;
import akka.japi.Procedure;
+import akka.persistence.AbstractPersistentActor;
import akka.persistence.SnapshotSelectionCriteria;
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 {
/**
* 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");
package org.opendaylight.controller.cluster.common.actor;
package org.opendaylight.controller.cluster.common.actor;
+import akka.actor.AbstractActor;
import akka.actor.ActorRef;
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;
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")
// 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")
- 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();
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
* 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;
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;
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")
// 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")
- 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();
- 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;
}
protected abstract void handleRecover(Object message) throws Exception;
*/
package org.opendaylight.controller.cluster.common.actor;
*/
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.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 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}
/**
* Represents behaviour that can be exhibited by actors of type {@link akka.actor.UntypedActor}
* </ul>
* The information is reported to {@link org.opendaylight.controller.cluster.reporting.MetricsReporter}
*/
* </ul>
* The information is reported to {@link org.opendaylight.controller.cluster.reporting.MetricsReporter}
*/
-public class MeteringBehavior implements Procedure<Object> {
+public class MeteringBehavior extends AbstractPartialFunction<Object, BoxedUnit> {
public static final String DOMAIN = "org.opendaylight.controller.actor.metric";
private static final String MSG_PROCESSING_RATE = "msg-rate";
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 final MetricRegistry metricRegistry = MetricsReporter.getInstance(DOMAIN).getMetricsRegistry();
-
- private String actorQualifiedName;
- private Timer msgProcessingTimer;
+ private final String actorQualifiedName;
+ private final Timer msgProcessingTimer;
+ private final PartialFunction<Object, BoxedUnit> 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.
/**
* Constructs an instance.
* @param actor whose behaviour needs to be metered
*/
public MeteringBehavior(final AbstractUntypedActorWithMetering actor) {
* @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);
* http://dropwizard.github.io/metrics/manual/core/#timers</a>
*
* @param message the message to process
* http://dropwizard.github.io/metrics/manual/core/#timers</a>
*
* @param message the message to process
- * @throws Exception on message failure
- @SuppressWarnings("checkstyle:IllegalCatch")
- public void apply(final Object message) throws Exception {
+ public BoxedUnit apply(Object message) {
final String messageType = message.getClass().getSimpleName();
final String messageType = message.getClass().getSimpleName();
final String msgProcessingTimeByMsgType =
MetricRegistry.name(actorQualifiedName, MSG_PROCESSING_RATE, messageType);
final String msgProcessingTimeByMsgType =
MetricRegistry.name(actorQualifiedName, MSG_PROCESSING_RATE, messageType);
final Timer msgProcessingTimerByMsgType = metricRegistry.timer(msgProcessingTimeByMsgType);
//start timers
final Timer msgProcessingTimerByMsgType = metricRegistry.timer(msgProcessingTimeByMsgType);
//start timers
final Timer.Context contextByMsgType = msgProcessingTimerByMsgType.time();
try {
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();
} finally {
//stop timers
contextByMsgType.stop();