diff --git a/akka-cluster-typed/src/test/java/jdocs/akka/cluster/typed/BasicClusterExampleTest.java b/akka-cluster-typed/src/test/java/jdocs/akka/cluster/typed/BasicClusterExampleTest.java index cf7a5d587c..aeb64c5f48 100644 --- a/akka-cluster-typed/src/test/java/jdocs/akka/cluster/typed/BasicClusterExampleTest.java +++ b/akka-cluster-typed/src/test/java/jdocs/akka/cluster/typed/BasicClusterExampleTest.java @@ -5,6 +5,7 @@ package jdocs.akka.cluster.typed; // #cluster-imports +import akka.actor.Address; import akka.actor.typed.*; import akka.actor.typed.javadsl.*; import akka.cluster.ClusterEvent; @@ -78,19 +79,20 @@ public class BasicClusterExampleTest { // extends JUnitSuite { Cluster cluster = Cluster.get(system); Cluster cluster2 = Cluster.get(system2); - // #cluster-subscribe TestProbe testProbe = TestProbe.create(system); - cluster - .subscriptions() - .tell(Subscribe.create(testProbe.ref(), ClusterEvent.MemberEvent.class)); + ActorRef subscriber = testProbe.getRef(); + // #cluster-subscribe + cluster.subscriptions().tell(Subscribe.create(subscriber, ClusterEvent.MemberEvent.class)); // #cluster-subscribe + Address anotherMemberAddress = cluster2.selfMember().address(); + // #cluster-leave-example + cluster.manager().tell(Leave.create(anotherMemberAddress)); + // subscriber will receive events MemberLeft, MemberExited and MemberRemoved // #cluster-leave-example - cluster.manager().tell(Leave.create(cluster2.selfMember().address())); testProbe.expectMessageClass(ClusterEvent.MemberLeft.class); testProbe.expectMessageClass(ClusterEvent.MemberExited.class); testProbe.expectMessageClass(ClusterEvent.MemberRemoved.class); - // #cluster-leave-example } finally { system.terminate(); diff --git a/akka-cluster-typed/src/test/scala/docs/akka/cluster/typed/BasicClusterExampleSpec.scala b/akka-cluster-typed/src/test/scala/docs/akka/cluster/typed/BasicClusterExampleSpec.scala index ed751f24a2..fe6029d1cc 100644 --- a/akka-cluster-typed/src/test/scala/docs/akka/cluster/typed/BasicClusterExampleSpec.scala +++ b/akka-cluster-typed/src/test/scala/docs/akka/cluster/typed/BasicClusterExampleSpec.scala @@ -118,17 +118,17 @@ class BasicClusterManualSpec extends WordSpec with ScalaFutures with Eventually try { //#cluster-create - val cluster1 = Cluster(system) + val cluster = Cluster(system) //#cluster-create val cluster2 = Cluster(system2) //#cluster-join - cluster1.manager ! Join(cluster1.selfMember.address) + cluster.manager ! Join(cluster.selfMember.address) //#cluster-join - cluster2.manager ! Join(cluster1.selfMember.address) + cluster2.manager ! Join(cluster.selfMember.address) eventually { - cluster1.state.members.toList.map(_.status) shouldEqual List(MemberStatus.up, MemberStatus.up) + cluster.state.members.toList.map(_.status) shouldEqual List(MemberStatus.up, MemberStatus.up) cluster2.state.members.toList.map(_.status) shouldEqual List(MemberStatus.up, MemberStatus.up) } @@ -137,7 +137,7 @@ class BasicClusterManualSpec extends WordSpec with ScalaFutures with Eventually //#cluster-leave eventually { - cluster1.state.members.toList.map(_.status) shouldEqual List(MemberStatus.up) + cluster.state.members.toList.map(_.status) shouldEqual List(MemberStatus.up) cluster2.isTerminated shouldEqual true } } finally { @@ -157,10 +157,12 @@ class BasicClusterManualSpec extends WordSpec with ScalaFutures with Eventually val cluster1 = Cluster(system1) val cluster2 = Cluster(system2) val cluster3 = Cluster(system3) + def cluster = cluster1 - //#cluster-subscribe val probe1 = TestProbe[MemberEvent]()(system1) - cluster1.subscriptions ! Subscribe(probe1.ref, classOf[MemberEvent]) + val subscriber = probe1.ref + //#cluster-subscribe + cluster.subscriptions ! Subscribe(subscriber, classOf[MemberEvent]) //#cluster-subscribe cluster1.manager ! Join(cluster1.selfMember.address) @@ -193,14 +195,16 @@ class BasicClusterManualSpec extends WordSpec with ScalaFutures with Eventually .map(_.status) shouldEqual List(MemberStatus.up, MemberStatus.up, MemberStatus.up) } + val anotherMemberAddress = cluster2.selfMember.address + //#cluster-leave-example + cluster.manager ! Leave(anotherMemberAddress) + // subscriber will receive events MemberLeft, MemberExited and MemberRemoved //#cluster-leave-example - cluster1.manager ! Leave(cluster2.selfMember.address) probe1.within(10.seconds) { probe1.expectMessageType[MemberLeft].member.address shouldEqual cluster2.selfMember.address probe1.expectMessageType[MemberExited].member.address shouldEqual cluster2.selfMember.address probe1.expectMessageType[MemberRemoved].member.address shouldEqual cluster2.selfMember.address } - //#cluster-leave-example eventually { cluster1.state.members.toList.map(_.status) shouldEqual List(MemberStatus.up, MemberStatus.up) diff --git a/akka-docs/src/main/paradox/typed/cluster.md b/akka-docs/src/main/paradox/typed/cluster.md index 17634e8cc1..5e539edac4 100644 --- a/akka-docs/src/main/paradox/typed/cluster.md +++ b/akka-docs/src/main/paradox/typed/cluster.md @@ -79,7 +79,7 @@ Cluster `subscriptions` can be used to receive messages when cluster state chang for all `MemberEvent`s, then using the `manager` to have a node leave the cluster will result in events for the node going through the lifecycle described in @ref:[Cluster Specification](../common/cluster.md). -This example subscribes with a `TestProbe` but in a real application it would be an Actor: +This example subscribes with a @scala[`subscriber: ActorRef[MemberEvent]`]@java[`ActorRef subscriber`]: Scala : @@snip [BasicClusterExampleSpec.scala](/akka-cluster-typed/src/test/scala/docs/akka/cluster/typed/BasicClusterExampleSpec.scala) { #cluster-subscribe }