1、pom文件
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<akka.version>2.6.13</akka.version>
</properties>
<dependencies>
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor-typed_2.13</artifactId>
<version>${akka.version}</version>
</dependency>
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-cluster-typed_2.13</artifactId>
<version>${akka.version}</version>
</dependency>
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-serialization-jackson_2.13</artifactId>
<version>${akka.version}</version>
</dependency>
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-cluster-tools_2.13</artifactId>
<version>${akka.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor-testkit-typed_2.13</artifactId>
<version>${akka.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
2、
在不知道 Actor 正在哪个节点运行的情况下,如何向其发送消息?
如何将消息发送给集群中对命名主题感兴趣的所有 Actor?
此模式提供了一个中介 Actor akka.cluster.pubsub.DistributedPubSubMediator,它管理 Actor 引用的注册表,并将条目复制到所有集群节点或标记有特定角色的一组节点中的同级 Actor。
DistributedPubSubMediator Actor 支持在集群中的所有节点或具有指定角色的所有节点上启动。中介程序可以以DistributedPubSub扩展启动,也可以作为普通的 Actor 启动。
Actor 注册到命名主题。这将在每个节点上启用许多订阅服务器。消息将传递给主题的所有订户。
为了提高效率,消息在每个节点(具有匹配主题)上仅通过线路(wire)发送一次,然后传递给本地主题表示的所有订阅者。
你可以使用DistributedPubSubMediator.Subscribe将 Actor 注册到本地中介。成功的Subscribe和Unsubscribe通过DistributedPubSubMediator.SubscribeAck和DistributedPubSubMediator.UnsubscribeAck确认。确认意味着订阅已注册,但在复制到其他节点之前,它仍然需要一些时间。
你可以通过发送DistributedPubSubMediator.Publish将消息发布到本地中介。
当中介 Actor 停止时,Actor 将自动从注册表中删除,或者你也可以使用DistributedPubSubMediator.Unsubscribe显式删除条目。
订阅者 Actor 的示例:
package sample.cluster.simple;
import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.cluster.pubsub.DistributedPubSub;
import akka.cluster.pubsub.DistributedPubSubMediator;
import akka.event.Logging;