Apache Pekko 1.7.1 常用工具与 API 详解
Apache Pekko 1.7.1 常用工具与 API 详解:说明 Pekko 无命令行工具但可通过 Classic API 调用,按类速查 ActorSystem / Props / actorOf / AbstractActor / tell / CoordinatedShutdown 核心用法,附 pekko-actor-typed 通路概览、JVM 堆与 locale 注意事项及 FAQ,全程实测。
Apache Pekko 1.7.1 常用工具与 API 详解
目标:详解 Apache Pekko 1.7.1 的核心 API 与工具使用。Pekko 以 jar 库形态提供,没有独立命令行工具,需通过 Java/Scala 代码调用。本文按类速查
ActorSystem/Props/AbstractActor/ActorRef.tell/CoordinatedShutdown等 Classic API 核心用法,并给出 Typed 通路概览与 FAQ。所有示例在 Ubuntu 22.04.5 + JDK 17 环境实测。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- 登录用户:root(演示账号)
- Java:OpenJDK 17.0.20.1
- 构建工具:Apache Maven 3.6.3
- Pekko 版本:1.7.1(pekko-actor_2.13)
- 示例工程:
/opt/pekko-demo/(主类 GreeterMain,位于默认包) - ActorSystem 名称:hello-pekko
二、工具概览
Pekko 以「类库 + jar」形态提供,没有 pekko 命令行可执行程序;对 Actor 系统的全部操作都通过 Java/Scala API 完成:把 jar 放进 classpath(Maven 依赖或 -cp),在自己的代码中调用核心类。
| 类别 | 代表类/方法 | 作用 |
|---|---|---|
| 系统与生命周期 | ActorSystem、terminate、CoordinatedShutdown | 创建运行时根节点、协调优雅关闭 |
| Actor 定义 | AbstractActor、receiveBuilder、Receive | Classic 通路定义消息处理逻辑 |
| Actor 创建 | Props、system.actorOf | 声明式创建 actor 并返回 ActorRef |
| 消息发送 | ActorRef.tell、ActorRef.noSender() | 异步 fire-and-forget 投递 |
| 系统地址 | pekko:// 协议 | 位置透明寻址(如 pekko://hello-pekko) |
| 扩展模块 | pekko-actor-typed、pekko-remote/cluster/stream/http | Typed API 与分布式/流处理扩展 |
三、前置条件
JDK 17 + Maven 已装、工程可编译可运行(安装与示例过程见《Ubuntu 22.04 安装 Apache Pekko 1.7.1 指南》与《Apache Pekko 1.7.1 构建并运行示例应用指南》篇):
cd /opt/pekko-demo && mvn -q clean compile
export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8" LANG=C.UTF-8 LC_ALL=C.UTF-8
四、核心 API 详解(Classic 通路,实测)
4.1 ActorSystem(运行时根节点)
ActorSystem.create 创建应用级运行时,系统名即地址主体;实测系统名 hello-pekko 对应地址 pekko://hello-pekko:
// 创建名为 hello-pekko 的 ActorSystem
ActorSystem system = ActorSystem.create("hello-pekko");
| 方法 | 说明 |
|---|---|
ActorSystem.create(name) | 创建运行时(本文实测系统名:hello-pekko) |
system.actorOf(props, name) | 在系统根创建顶层 actor |
system.terminate() | 触发协调关闭(见 4.5 节) |
4.2 Props 与 actorOf(创建 actor)
Props.create 声明 actor 类型,actorOf 创建实例并返回 ActorRef(句柄):
// 通过 Props 创建 Greeter actor,得到 ActorRef
ActorRef greeter = system.actorOf(Props.create(Greeter.class), "greeter");
- 第二个参数
"greeter"是 actor 在系统内的路径名,完整路径为pekko://hello-pekko/user/greeter;同一路径下同名 actor 不可重复创建(重名会失败抛异常)。 Props.create(Greeter.class)声明 actor 类型,还可携带构造参数。
4.3 AbstractActor 与 receiveBuilder(消息接收,Classic API)
Classic 通路继承 AbstractActor,在 createReceive() 中用 receiveBuilder 按消息类型注册处理逻辑:
public static class Greeter extends AbstractActor {
@Override
public Receive createReceive() {
return receiveBuilder()
.match(String.class, msg -> {
System.out.println("Greeter 收到消息: " + msg);
})
.build();
}
}
match(Class<T>, Consumer<T>)按类型匹配消息,可串联多个 match 处理不同消息类型。build()生成Receive对象,消息按注册顺序匹配。
4.4 ActorRef.tell 与 noSender(消息发送)
// tell = fire-and-forget 发消息(无需等待回复)
greeter.tell("Hello Pekko!", ActorRef.noSender());
tell(msg, sender)异步投递:消息进入目标 mailbox 后由 actor 串行处理,调用方不阻塞。- 第二个参数是「发送者」引用,用于回信;无回信场景传
ActorRef.noSender()(实测即本文用法)。
4.5 系统关闭与 CoordinatedShutdown
实测采用「短暂等待 + terminate」的收尾方式:
// 短暂等待消息被异步处理,然后优雅关闭 ActorSystem
Thread.sleep(2000);
system.terminate();
System.out.println("ActorSystem terminated.");
terminate 触发的协调关闭在实测日志中可见:
[INFO] [10/11/2026 11:25:21.212] [GreeterMain.main()] [CoordinatedShutdown(pekko://hello-pekko)] Running CoordinatedShutdown with reason [ActorSystemTerminateReason]
💡 说明:CoordinatedShutdown 按阶段(phase)顺序执行关闭,本例 reason 为 ActorSystemTerminateReason;stdout 与 stderr 交错顺序每次运行可能不同。
4.6 Typed 通路概览(pekko-actor-typed)
⚠️ 前置说明:本文实测走 Classic 通路;Typed 通路为官方对新项目的推荐方向,此处仅给形态与坐标说明,代码形态以官方文档为准。
| 项 | Classic(本文实测) | Typed(官方推荐) |
|---|---|---|
| artifact | pekko-actor_2.13 | pekko-actor-typed_2.13(版本同为 1.7.1) |
| Actor 定义 | 继承 AbstractActor + receiveBuilder | AbstractBehavior<T> + Behavior<T> |
| 创建 | system.actorOf(Props.create(...)) | ActorSystem.create(Behavior, name) |
| 消息类型 | Object(按类型 match) | 强类型消息协议 |
Typed 通路引入坐标(Maven):
<dependency>
<groupId>org.apache.pekko</groupId>
<artifactId>pekko-actor-typed_2.13</artifactId>
<version>1.7.1</version>
</dependency>
五、注意事项
⚠️ 注意:
- tell 是异步的:terminate 前需保留等待时间(实测
Thread.sleep(2000)),否则消息可能未处理。- artifact 后缀
_2.13不可省略;所有 pekko-* 模块统一 1.7.1。- 中文输出需 UTF-8:
JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8"与LANG=C.UTF-8 LC_ALL=C.UTF-8。- 运行堆内存建议
-Xms256m -Xmx512m(MAVEN_OPTS 注入,jps -lv可复核)。- 新项目优先评估 Typed 通路;Classic 通路成熟稳定,本文示例即 Classic。
六、常见问题
Q1:运行报 NoClassDefFoundError(scala 或 typesafe 相关类)?
classpath 缺传递依赖。方案 A(Maven)会自动带上 scala-library 2.13.18 与 config 1.4.9;直接用 jar 时需按《Ubuntu 22.04 安装 Apache Pekko 1.7.1 指南》方案 B 补齐三个 jar。
Q2:消息发送后没有任何打印?
tell 异步投递,确认 terminate 前保留了 Thread.sleep(2000);另确认 receiveBuilder 匹配的消息类型与实际发送类型一致(本文均为 String)。
Q3:Classic 与 Typed 怎么选? 新项目官方推荐 Typed(编译期类型安全);存量 Classic 项目可继续使用,两者 artifact 并存,不冲突。
Q4:能通过命令行管理 Pekko 吗? 不能。Pekko 是嵌入式库,没有 CLI;管理与监控走代码 API 与日志(如 CoordinatedShutdown 日志、死信日志)。
七、参考链接
- Apache Pekko 官方文档:
https://pekko.apache.org/docs/pekko/current/ - Classic Actor 文档:
https://pekko.apache.org/docs/pekko/current/general/actors.html - Typed Actor 文档:
https://pekko.apache.org/docs/pekko/current/typed/actors.html