Remove API may change from akka typed (#27027)

Note that it will become fully stable in 2.6.0 so this doesn't mean that there will be no more API changes.

* Remove from event sourced behavior
* Remove api may change settings from typed modules
* Dont check mima for typed until 2.6
This commit is contained in:
Christopher Batey 2019-05-29 14:38:14 +01:00 committed by Patrik Nordwall
parent 11453aad5d
commit 37f42d3220
31 changed files with 10 additions and 191 deletions

View file

@ -11,7 +11,7 @@ import akka.actor.setup.ActorSystemSetup
import akka.actor.typed.internal.{ EventStreamExtension, InternalRecipientRef }
import akka.actor.typed.internal.adapter.{ ActorSystemAdapter, GuardianStartupBehavior, PropsAdapter }
import akka.actor.typed.receptionist.Receptionist
import akka.annotation.{ ApiMayChange, DoNotInherit }
import akka.annotation.DoNotInherit
import akka.util.Helpers.Requiring
import akka.util.Timeout
import akka.{ Done, actor => untyped }
@ -29,7 +29,6 @@ import scala.concurrent.{ ExecutionContextExecutor, Future }
* Not for user extension.
*/
@DoNotInherit
@ApiMayChange
abstract class ActorSystem[-T] extends ActorRef[T] with Extensions { this: InternalRecipientRef[T] =>
/**

View file

@ -9,7 +9,7 @@ import akka.actor.InvalidMessageException
import akka.actor.typed.internal.{ BehaviorImpl, InterceptorImpl }
import akka.actor.typed.internal.BehaviorImpl.OrElseBehavior
import akka.util.{ LineNumbers, OptionVal }
import akka.annotation.{ ApiMayChange, DoNotInherit, InternalApi }
import akka.annotation.{ DoNotInherit, InternalApi }
import akka.actor.typed.scaladsl.{ ActorContext => SAC }
import scala.annotation.switch
@ -54,7 +54,6 @@ private[akka] object BehaviorTags {
*
* Not for user extension.
*/
@ApiMayChange
@DoNotInherit
abstract class Behavior[T](private[akka] val _tag: Int) { behavior =>

View file

@ -4,7 +4,6 @@
package akka.actor.typed
import akka.annotation.ApiMayChange
import akka.annotation.DoNotInherit
import akka.annotation.InternalApi
@ -33,7 +32,6 @@ object Props {
* Not for user extension.
*/
@DoNotInherit
@ApiMayChange
abstract class Props private[akka] () extends Product with Serializable {
/**

View file

@ -5,7 +5,6 @@
package akka.actor.typed
import akka.annotation.DoNotInherit
import akka.annotation.ApiMayChange
/**
* This trait is not meant to be extended by user code. If you do so, you may
@ -14,7 +13,6 @@ import akka.annotation.ApiMayChange
* Not for user extension.
*/
@DoNotInherit
@ApiMayChange
trait TypedActorContext[T] {
// this should be a pure interface, i.e. only abstract methods

View file

@ -8,7 +8,6 @@ import java.time.Duration
import java.util.function.{ BiFunction, Function => JFunction }
import akka.annotation.DoNotInherit
import akka.annotation.ApiMayChange
import akka.actor.typed._
import java.util.Optional
import java.util.concurrent.CompletionStage
@ -36,7 +35,6 @@ import scala.concurrent.ExecutionContextExecutor
* Not for user extension.
*/
@DoNotInherit
@ApiMayChange
trait ActorContext[T] extends TypedActorContext[T] {
// this must be a pure interface, i.e. only abstract methods

View file

@ -9,7 +9,6 @@ import java.util.function.{ Function => JFunction }
import akka.actor.typed._
import akka.actor.typed.internal.{ BehaviorImpl, Supervisor, TimerSchedulerImpl, WithMdcBehaviorInterceptor }
import akka.annotation.ApiMayChange
import akka.japi.function.{ Effect, Function2 => JapiFunction2 }
import akka.japi.pf.PFBuilder
import akka.util.unused
@ -20,7 +19,6 @@ import scala.reflect.ClassTag
/**
* Factories for [[akka.actor.typed.Behavior]].
*/
@ApiMayChange
object Behaviors {
private[this] val _two2same = new JapiFunction2[ActorContext[Any], Any, Behavior[Any]] {

View file

@ -5,7 +5,7 @@
package akka.actor.typed.scaladsl
import akka.actor.typed._
import akka.annotation.{ ApiMayChange, DoNotInherit }
import akka.annotation.DoNotInherit
import akka.util.Timeout
import scala.concurrent.{ ExecutionContextExecutor, Future }
@ -35,7 +35,6 @@ import akka.annotation.InternalApi
* Not for user extension.
*/
@DoNotInherit
@ApiMayChange
trait ActorContext[T] extends TypedActorContext[T] {
/**

View file

@ -5,7 +5,7 @@
package akka.actor.typed
package scaladsl
import akka.annotation.{ ApiMayChange, DoNotInherit, InternalApi }
import akka.annotation.{ DoNotInherit, InternalApi }
import akka.actor.typed.internal._
import scala.reflect.{ classTag, ClassTag }
@ -13,7 +13,6 @@ import scala.reflect.{ classTag, ClassTag }
/**
* Factories for [[akka.actor.typed.Behavior]].
*/
@ApiMayChange
object Behaviors {
/**

View file

@ -12,14 +12,6 @@ To use Akka Actor Typed, you must add the following dependency in your project:
## Introduction
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
As discussed in @ref:[Actor Systems](../general/actor-systems.md) Actors are about
sending messages between independent units of computation, but how does that
look like?

View file

@ -15,14 +15,6 @@ To use Akka Cluster Sharding Typed, you must add the following dependency in you
For an introduction to Sharding concepts see @ref:[Cluster Sharding](../cluster-sharding.md). This documentation shows how to use the typed
Cluster Sharding API.
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
## Basic example
Sharding is accessed via the `ClusterSharding` extension

View file

@ -12,14 +12,6 @@ To use Cluster Singleton, you must add the following dependency in your project:
## Introduction
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
For some use cases it is convenient and sometimes also mandatory to ensure that
you have exactly one actor of a certain type running somewhere in the cluster.

View file

@ -15,14 +15,6 @@ To use Akka Cluster Typed, you must add the following dependency in your project
For an introduction to Akka Cluster concepts see @ref:[Cluster Specification](../common/cluster.md). This documentation shows how to use the typed
Cluster API.
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
## Examples
All of the examples below assume the following imports:

View file

@ -12,14 +12,6 @@ To use Akka Cluster Distributed Data Typed, you must add the following dependenc
## Introduction
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
*Akka Distributed Data* is useful when you need to share data between nodes in an
Akka Cluster. The data is accessed with an actor providing a key-value store like API.
The keys are unique identifiers with type information of the data values. The values

View file

@ -1,13 +1,5 @@
# How the Actor Model Meets the Needs of Modern, Distributed Systems
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
As described in the previous topic, common programming practices do not properly
address the needs of demanding modern systems. Thankfully, we
don't need to scrap everything we know. Instead, the actor model addresses these

View file

@ -1,13 +1,5 @@
# Why modern systems need a new programming model
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
The actor model was proposed decades ago by @extref[Carl Hewitt](wikipedia:Carl_Hewitt#Actor_model) as a way to handle parallel processing in a high performance network — an environment that was not available at the time. Today, hardware and infrastructure capabilities have caught up with and exceeded Hewitt's vision. Consequently, organizations building distributed systems with demanding requirements encounter challenges that cannot fully be solved with a traditional object-oriented programming (OOP) model, but that can benefit from the actor model.
Today, the actor model is not only recognized as a highly effective solution — it has been proven in production for some of the world's most demanding applications. To highlight issues that the actor model addresses, this topic discusses the following mismatches between traditional programming assumptions and the reality of modern multi-threaded, multi-CPU architectures:

View file

@ -1,13 +1,5 @@
# Getting Started Guide
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
@@toc { depth=2 }
@@@ index

View file

@ -1,13 +1,5 @@
# Introduction to Akka
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
Welcome to Akka, a set of open-source libraries for designing scalable, resilient systems that span processor cores and networks. Akka allows you to focus on meeting business needs instead of writing low-level code to provide reliable behavior, fault tolerance, and high performance.
Many common practices and accepted programming models do not address important challenges

View file

@ -1,13 +1,5 @@
# Overview of Akka libraries and modules
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
Before delving into some best practices for writing actors, it will be helpful to preview the most commonly used Akka libraries. This will help you start thinking about the functionality you want to use in your system. All core Akka functionality is available as Open Source Software (OSS). Lightbend sponsors Akka development but can also help you with [commercial offerings ](https://www.lightbend.com/platform/subscription) such as training, consulting, support, and [Enterprise Suite](https://www.lightbend.com/platform/production) — a comprehensive set of tools for managing Akka systems.
The following capabilities are included with Akka OSS and are introduced later on this page:

View file

@ -1,13 +1,5 @@
# Introduction to the Example
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
When writing prose, the hardest part is often composing the first few sentences. There is a similar "blank canvas" feeling
when starting to build an Akka system. You might wonder: Which should be the first actor? Where should it live? What should it do?
Fortunately — unlike with prose — established best practices can guide us through these initial steps. In the remainder of this guide, we examine the core logic of a simple Akka application to introduce you to actors and show you how to formulate solutions with them. The example demonstrates common patterns that will help you kickstart your Akka projects.

View file

@ -12,14 +12,6 @@ Add the following dependency in your project:
## Introduction
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
Use of Akka relieves you from creating the infrastructure for an actor system and from writing the low-level code necessary to control basic behavior. To appreciate this, let's look at the relationships between actors you create in your code and those that Akka creates and manages for you internally, the actor lifecycle, and failure handling.
## The Akka actor hierarchy

View file

@ -2,14 +2,6 @@
## Introduction
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
With an understanding of actor hierarchy and behavior, the remaining question is how to map the top-level components of our IoT system to actors. The _user guardian_ can be an actor that represents the whole application. In other words, we will have a single top-level actor in our IoT system. The components that create and manage devices and dashboards will be children of this actor. This allows us to refactor the example use case architecture diagram into a tree of actors:
![actor tree diagram of the architecture](diagrams/arch_tree_diagram.png)

View file

@ -2,14 +2,6 @@
## Introduction
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
In the previous topics we explained how to view actor systems _in the large_, that is, how components should be represented, how actors should be arranged in the hierarchy. In this part, we will look at actors _in the small_ by implementing the device actor.
If we were working with objects, we would typically design the API as _interfaces_, a collection of abstract methods to be filled out by the actual implementation. In the world of actors, protocols take the place of interfaces. While it is not possible to formalize general protocols in the programming language, we can compose their most basic element, messages. So, we will start by identifying the messages we will want to send to device actors.

View file

@ -2,14 +2,6 @@
## Introduction
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
Let's take a closer look at the main functionality required by our use case. In a complete IoT system for monitoring home temperatures, the steps for connecting a device sensor to our system might look like this:
1. A sensor device in the home connects through some protocol.

View file

@ -2,14 +2,6 @@
## Introduction
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
The conversational patterns that we have seen so far are simple in the sense that they require the actor to keep little or no state. Specifically:
* Device actors return a reading, which requires no state change

View file

@ -1,13 +1,5 @@
# Akka Typed
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
@@toc { depth=2 }
@@@ index

View file

@ -23,14 +23,6 @@ Akka Persistence is a library for building event sourced actors. For background
see the @ref:[untyped Akka Persistence section](../persistence.md). This documentation shows how the typed API for persistence
works and assumes you know what is meant by `Command`, `Event` and `State`.
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
## Example
Let's start with a simple example. The minimum required for a `EventSourcedBehavior` is:

View file

@ -19,14 +19,6 @@ This module contains typed alternatives to the @ref:[already existing `ActorRef`
The materializer created from these factory methods and sources together with sinks contained in this module can be mixed and matched with the original Akka Streams building blocks from the original module.
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
## Actor Source
A stream that is driven by messages sent to a particular actor can be started with @scala[@scaladoc[`ActorSource.actorRef`](akka.stream.typed.scaladsl.ActorSource#actorRef)]@java[@javadoc[`ActorSource.actorRef`](akka.stream.typed.javadsl.ActorSource#actorRef)]. This source materializes to a typed `ActorRef` which only accepts messages that are of the same type as the stream.

View file

@ -35,14 +35,6 @@ Certain @apidoc[Behavior]s will be hard to test synchronously e.g. if they spawn
before observing the effect you want to test. Further support for controlling the scheduler and execution context used
will be added.
@@@ note
This module is ready to be used in production, but it is still marked as @ref:[may change](../common/may-change.md).
This means that API or semantics can change without warning or deprecation period, but such changes will
be collected and be performed in Akka 2.6.0 rather than in 2.5.x patch releases.
@@@
## Synchronous behavior testing
The following demonstrates how to test:

View file

@ -12,14 +12,12 @@ import akka.actor.typed.BackoffSupervisorStrategy
import akka.actor.typed.Behavior
import akka.actor.typed.Behavior.DeferredBehavior
import akka.actor.typed.javadsl.ActorContext
import akka.annotation.ApiMayChange
import akka.annotation.InternalApi
import akka.persistence.typed.EventAdapter
import akka.persistence.typed._
import akka.persistence.typed.internal._
import akka.util.unused
@ApiMayChange
abstract class EventSourcedBehavior[Command, Event, State] private[akka] (
val persistenceId: PersistenceId,
onPersistFailure: Optional[BackoffSupervisorStrategy])
@ -205,7 +203,6 @@ abstract class EventSourcedBehavior[Command, Event, State] private[akka] (
* There will be compilation errors if the returned effect isn't a [[ReplyEffect]], which can be
* created with `Effects().reply`, `Effects().noReply`, [[Effect.thenReply]], or [[Effect.thenNoReply]].
*/
@ApiMayChange
abstract class EventSourcedBehaviorWithEnforcedReplies[Command, Event, State](
persistenceId: PersistenceId,
backoffSupervisorStrategy: Optional[BackoffSupervisorStrategy])

View file

@ -368,7 +368,6 @@ lazy val testkit = akkaModule("akka-testkit")
lazy val actorTyped = akkaModule("akka-actor-typed")
.dependsOn(actor)
.settings(AkkaBuild.mayChangeSettings)
.settings(AutomaticModuleName.settings("akka.actor.typed")) // fine for now, eventually new module name to become typed.actor
.settings(OSGi.actorTyped)
.settings(initialCommands :=
@ -380,7 +379,6 @@ lazy val actorTyped = akkaModule("akka-actor-typed")
import akka.util.Timeout
implicit val timeout = Timeout(5.seconds)
""")
.disablePlugins(MimaPlugin)
lazy val persistenceTyped = akkaModule("akka-persistence-typed")
.dependsOn(
@ -390,10 +388,8 @@ lazy val persistenceTyped = akkaModule("akka-persistence-typed")
actorTypedTests % "test->test",
actorTestkitTyped % "compile->compile;test->test")
.settings(Dependencies.persistenceShared)
.settings(AkkaBuild.mayChangeSettings)
.settings(AutomaticModuleName.settings("akka.persistence.typed"))
.settings(OSGi.persistenceTyped)
.disablePlugins(MimaPlugin)
lazy val clusterTyped = akkaModule("akka-cluster-typed")
.dependsOn(
@ -407,9 +403,7 @@ lazy val clusterTyped = akkaModule("akka-cluster-typed")
actorTestkitTyped % "test->test",
actorTypedTests % "test->test",
remoteTests % "test->test")
.settings(AkkaBuild.mayChangeSettings)
.settings(AutomaticModuleName.settings("akka.cluster.typed"))
.disablePlugins(MimaPlugin)
.configs(MultiJvm)
.enablePlugins(MultiNodeScalaTest)
@ -422,11 +416,9 @@ lazy val clusterShardingTyped = akkaModule("akka-cluster-sharding-typed")
actorTypedTests % "test->test",
persistenceTyped % "test->test",
remoteTests % "test->test")
.settings(AkkaBuild.mayChangeSettings)
.settings(AutomaticModuleName.settings("akka.cluster.sharding.typed"))
// To be able to import ContainerFormats.proto
.settings(Protobuf.importPath := Some(baseDirectory.value / ".." / "akka-remote" / "src" / "main" / "protobuf"))
.disablePlugins(MimaPlugin)
.configs(MultiJvm)
.enablePlugins(MultiNodeScalaTest)
@ -437,9 +429,7 @@ lazy val streamTyped = akkaModule("akka-stream-typed")
streamTestkit % "test->test",
actorTestkitTyped % "test->test",
actorTypedTests % "test->test")
.settings(AkkaBuild.mayChangeSettings)
.settings(AutomaticModuleName.settings("akka.stream.typed"))
.disablePlugins(MimaPlugin)
.enablePlugins(ScaladocNoVerificationOfDiagrams)
lazy val actorTestkitTyped = akkaModule("akka-actor-testkit-typed")

View file

@ -35,8 +35,11 @@ object MiMa extends AutoPlugin {
else if (projectName.contains("coordination")) 22
else 0
expandVersions(2, 5, firstPatchOf25 to latestPatchOf25) ++
expandVersions(2, 6, 0 to latestPatchOf26)
if (!projectName.contains("typed")) {
expandVersions(2, 5, firstPatchOf25 to latestPatchOf25)
} else {
Nil
} ++ expandVersions(2, 6, 0 to latestPatchOf26)
case v if v.startsWith("2.13") =>
// When 2.13.0 is actually out, release 2.5.latestPatchOf25 for that
// and add it here. https://github.com/akka/akka/issues/26764
@ -45,6 +48,7 @@ object MiMa extends AutoPlugin {
}
val akka25PromotedArtifacts = Set("akka-distributed-data")
val akkaTypedModules = Set("akka-actor-typed")
// check against all binary compatible artifacts
versions.map { v =>