diff --git a/akka-actor-tests/src/test/java/akka/actor/JavaExtension.java b/akka-actor-tests/src/test/java/akka/actor/JavaExtension.java index b7bad9b227..aea376d4c8 100644 --- a/akka-actor-tests/src/test/java/akka/actor/JavaExtension.java +++ b/akka-actor-tests/src/test/java/akka/actor/JavaExtension.java @@ -33,9 +33,24 @@ public class JavaExtension extends JUnitSuite { } } + static class OtherExtensionId extends AbstractExtensionId implements ExtensionIdProvider { + + public final static OtherExtensionId OtherExtensionProvider = new OtherExtensionId(); + + @Override + public ExtensionId lookup() { + return OtherExtensionId.OtherExtensionProvider; + } + + @Override + public OtherExtension createExtension(ExtendedActorSystem system) { + return new OtherExtension(system); + } + + } + static class OtherExtension implements Extension { - static final ExtensionKey key = new ExtensionKey(OtherExtension.class) { - }; + static final ExtensionId key = OtherExtensionId.OtherExtensionProvider; public final ExtendedActorSystem system; diff --git a/akka-actor/src/main/scala/akka/actor/Extension.scala b/akka-actor/src/main/scala/akka/actor/Extension.scala index 65327f850d..5d122461ad 100644 --- a/akka-actor/src/main/scala/akka/actor/Extension.scala +++ b/akka-actor/src/main/scala/akka/actor/Extension.scala @@ -61,8 +61,6 @@ import scala.reflect.ClassTag * ... * } * }}} - * - * See also [[akka.actor.ExtensionKey]] for a concise way of formulating extensions. */ trait Extension @@ -146,6 +144,7 @@ trait ExtensionIdProvider { * `get` method. * */ +@deprecated(message = "Use a regular Extension instead", since = "2.5.0") abstract class ExtensionKey[T <: Extension](implicit m: ClassTag[T]) extends ExtensionId[T] with ExtensionIdProvider { def this(clazz: Class[T]) = this()(ClassTag(clazz)) diff --git a/akka-actor/src/main/scala/akka/event/Logging.scala b/akka-actor/src/main/scala/akka/event/Logging.scala index 0514071fd3..1717bd2d51 100644 --- a/akka-actor/src/main/scala/akka/event/Logging.scala +++ b/akka-actor/src/main/scala/akka/event/Logging.scala @@ -5,13 +5,12 @@ package akka.event import java.util.concurrent.TimeoutException import java.util.concurrent.atomic.AtomicInteger -import java.util.logging import akka.actor.ActorSystem.Settings import akka.actor._ import akka.dispatch.RequiresMessageQueue -import akka.event.Logging.{ Extension ⇒ _, _ } -import akka.util.{ OptionVal, ReentrantGuard } +import akka.event.Logging._ +import akka.util.ReentrantGuard import akka.util.Helpers.toRootLowerCase import akka.{ AkkaException, ConfigurationException } @@ -175,7 +174,7 @@ trait LoggingBus extends ActorEventBus { * INTERNAL API */ private def addLogger(system: ActorSystemImpl, clazz: Class[_ <: Actor], level: LogLevel, logName: String): ActorRef = { - val name = "log" + Extension(system).id() + "-" + simpleName(clazz) + val name = "log" + LogExt(system).id() + "-" + simpleName(clazz) val actor = system.systemActorOf(Props(clazz).withDispatcher(system.settings.LoggersDispatcher), name) implicit def timeout = system.settings.LoggerStartTimeout import akka.pattern.ask @@ -409,7 +408,10 @@ object Logging { /** * INTERNAL API */ - private[akka] object Extension extends ExtensionKey[LogExt] + private[akka] object LogExt extends ExtensionId[LogExt] { + override def createExtension(system: ExtendedActorSystem): LogExt = + new LogExt(system) + } /** * INTERNAL API diff --git a/akka-docs/rst/project/migration-guide-2.4.x-2.5.x.rst b/akka-docs/rst/project/migration-guide-2.4.x-2.5.x.rst index 3466d6a222..fe43033b36 100644 --- a/akka-docs/rst/project/migration-guide-2.4.x-2.5.x.rst +++ b/akka-docs/rst/project/migration-guide-2.4.x-2.5.x.rst @@ -216,6 +216,30 @@ Actor DSL deprecation Actor DSL is a rarely used feature and thus will be deprecated and removed. Use plain ``system.actorOf`` instead of the DSL to create Actors if you have been using it. +ExtensionKey Deprecation +------------------------ + +``ExtensionKey`` is a shortcut for writing :ref:`extending-akka-scala` but extensions created with it +cannot be used from Java and it does in fact not save many lines of code over directly implementing ``ExtensionId``. + + +Old:: + + object MyExtension extends ExtensionKey[MyExtension] + +New:: + + object MyExtension extends extends ExtensionId[MyExtension] with ExtensionIdProvider { + + override def lookup = MyExtension + + override def createExtension(system: ExtendedActorSystem): MyExtension = + new MyExtension(system) + + // needed to get the type right when used from Java + override def get(system: ActorSystem): MyExtension = super.get(system) + } + Streams ======= diff --git a/akka-docs/rst/scala/code/docs/serialization/SerializationDocSpec.scala b/akka-docs/rst/scala/code/docs/serialization/SerializationDocSpec.scala index ff9cf631bc..ddb457a16e 100644 --- a/akka-docs/rst/scala/code/docs/serialization/SerializationDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/serialization/SerializationDocSpec.scala @@ -4,6 +4,7 @@ package docs.serialization { + import akka.actor.{ExtensionId, ExtensionIdProvider} import akka.testkit._ //#imports import akka.actor.{ ActorRef, ActorSystem } @@ -11,7 +12,6 @@ package docs.serialization { import com.typesafe.config.ConfigFactory //#imports - import akka.actor.ExtensionKey import akka.actor.ExtendedActorSystem import akka.actor.Extension import akka.actor.Address @@ -218,7 +218,14 @@ package docs.serialization { //#actorref-serializer //#external-address - object ExternalAddress extends ExtensionKey[ExternalAddressExt] + object ExternalAddress extends ExtensionId[ExternalAddressExt] with ExtensionIdProvider { + override def lookup() = ExternalAddress + + override def createExtension(system: ExtendedActorSystem): ExternalAddressExt = + new ExternalAddressExt(system) + + override def get(system: ActorSystem): ExternalAddressExt = super.get(system) + } class ExternalAddressExt(system: ExtendedActorSystem) extends Extension { def addressFor(remoteAddr: Address): Address = @@ -236,7 +243,14 @@ package docs.serialization { val theActorSystem: ActorSystem = system //#external-address-default - object ExternalAddress extends ExtensionKey[ExternalAddressExt] + object ExternalAddress extends ExtensionId[ExternalAddressExt] with ExtensionIdProvider { + override def lookup() = ExternalAddress + + override def createExtension(system: ExtendedActorSystem): ExternalAddressExt = + new ExternalAddressExt(system) + + override def get(system: ActorSystem): ExternalAddressExt = super.get(system) + } class ExternalAddressExt(system: ExtendedActorSystem) extends Extension { def addressForAkka: Address = system.provider.getDefaultAddress diff --git a/akka-persistence/src/test/scala/akka/persistence/PersistentActorJournalProtocolSpec.scala b/akka-persistence/src/test/scala/akka/persistence/PersistentActorJournalProtocolSpec.scala index d0f5bf7328..6d5a7181d2 100644 --- a/akka-persistence/src/test/scala/akka/persistence/PersistentActorJournalProtocolSpec.scala +++ b/akka-persistence/src/test/scala/akka/persistence/PersistentActorJournalProtocolSpec.scala @@ -74,7 +74,14 @@ akka.persistence.snapshot-store.plugin = "akka.persistence.no-snapshot-store" } } -object JournalPuppet extends ExtensionKey[JournalProbe] +object JournalPuppet extends ExtensionId[JournalProbe] with ExtensionIdProvider { + override def lookup()= JournalPuppet + + override def createExtension(system: ExtendedActorSystem): JournalProbe = + new JournalProbe()(system) + + override def get(system: ActorSystem): JournalProbe = super.get(system) +} class JournalProbe(implicit private val system: ExtendedActorSystem) extends Extension { val probe = TestProbe() val ref = probe.ref diff --git a/project/MiMa.scala b/project/MiMa.scala index a1da1f91d8..d43ad08dd2 100644 --- a/project/MiMa.scala +++ b/project/MiMa.scala @@ -433,7 +433,10 @@ object MiMa extends AutoPlugin { ProblemFilters.exclude[IncompatibleResultTypeProblem]("akka.cluster.ddata.DurableStore#Store.data"), ProblemFilters.exclude[IncompatibleMethTypeProblem]("akka.cluster.ddata.DurableStore#Store.copy"), ProblemFilters.exclude[IncompatibleMethTypeProblem]("akka.cluster.ddata.DurableStore#Store.this"), - ProblemFilters.exclude[IncompatibleMethTypeProblem]("akka.cluster.ddata.LmdbDurableStore.dbPut") + ProblemFilters.exclude[IncompatibleMethTypeProblem]("akka.cluster.ddata.LmdbDurableStore.dbPut"), + + // #22208 remove extension key + ProblemFilters.exclude[MissingClassProblem]("akka.event.Logging$Extension$") // NOTE: filters that will be backported to 2.4 should go to the latest 2.4 version below )