Apache ODE 1.3.8 介绍与入门指南
Apache ODE 1.3.8 介绍与入门:WS-BPEL 2.0 流程编排引擎定位与 Apache Attic 退役状态、流程/部署描述符/伙伴链接等核心概念、Maven 坐标核实与 ode.war 在 JDK 8 + Tomcat 9 的部署实测、HelloWorld2 流程经 SOAP DeploymentService 部署与同步调用的全流程排坑记录。
Apache ODE 1.3.8 介绍与入门指南
⚠️ 项目已退役:Apache ODE(Orchestration Director Engine)已于 2019-08 作出退役决议、2020-01 完成向 Apache Attic 的迁移(ATTIC-175),最后版本为 1.3.8,此后不再有任何维护与安全更新。本文仅适合存量 BPEL 系统的维护者阅读,勿用于新项目选型。
目标:介绍 Apache ODE——一个执行 WS-BPEL 2.0 标准业务流程的编排引擎,覆盖项目定位与退役状态、BPEL 核心概念、Maven 发布物核实、ode.war 在 JDK 8 + Tomcat 9 环境的部署实测,以及官方 HelloWorld2 示例经 SOAP DeploymentService 部署、SOAP 1.1 同步调用的完整链路;全部命令与输出于 2026-10-14 至 10-15 在 Ubuntu 22.04 实测取得(Attic 状态页与 Maven Central 信息核实于 2026-10-15),写作时项目已退役进入 Apache Attic。
一、环境信息
- 操作系统:Ubuntu 22.04(x86_64)
- JDK:OpenJDK 8(apt 安装 openjdk-8-jdk),
java -version实测:
openjdk version "1.8.0_504"
OpenJDK Runtime Environment (build 1.8.0_504-8u504-ga-1ubuntu1~22.04.3-b01)
OpenJDK 64-Bit Server VM (build 25.504-b01, mixed mode)
- Servlet 服务器:Apache Tomcat 9.0.123(经
https://archive.apache.org/dist/tomcat/tomcat-9/目录核实为 9.x 当前最新,解压到/opt/tomcat),版本信息实测:
Server version: Apache Tomcat/9.0.123
JVM Version: 1.8.0_504-8u504-ga-1ubuntu1~22.04.3-b01
- ODE 版本:1.3.8(最后版本;Maven Central 坐标
org.apache.ode:apache-ode-war,发布物核实见 4.1 节) - 辅助工具:curl(HTTP 验证)、zip(示例打包)、python3(构造 SOAP 1.1 报文)
- 信息核实方式:Attic 项目页、Maven Central maven-metadata 均于 2026-10-15 抓取
- 实测边界:本文完成 ode.war 部署、HelloWorld2 流程部署与 SOAP 同步调用全链路实测;异步流程、外部数据库接入(内嵌 Derby 以外的持久化配置)未实测,以官方文档为准
二、定位与退役状态
2.1 项目定位:WS-BPEL 2.0 流程编排引擎
(概念介绍,以官方文档为准)Apache ODE 全称 Orchestration Director Engine,核心能力是执行按 WS-BPEL 2.0(OASIS 标准)编写的业务流程:开发者用 BPEL XML 描述一组服务之间的编排逻辑(顺序、分支、并行、事件处理等),配合 WSDL 描述接口,ODE 引擎负责解析、编译并运行这些流程,把流程实例与 SOAP 服务绑定起来。1.3.8 以 war 包形态部署进 Servlet 服务器(本文用 Tomcat 9),内嵌 Apache Derby 数据库存储流程状态,并经 Axis2 暴露 SOAP 端点(本文第五章的部署与调用实测均走 SOAP)。
在 SOA 与 Hadoop 同期的企业技术栈年代,BPEL 引擎是流程整合层的常见选型,ODE 曾被用于各类 SOA 流程平台与编排场景(也有基于它的流程集群方案);这类系统至今仍有存量在运行——维护这些存量资产,是 ODE 当前的主要价值所在。
2.2 退役状态(必须知晓)
Attic 项目页(https://attic.apache.org/projects/ode.html ,2026-10-15 实测抓取)确认的时间线:
| 事项 | 时间 |
|---|---|
| 成为 Apache 顶级项目(TLP) | 2007-07 |
| 董事会作出退役决议 | 2019-08 |
| 完成向 Apache Attic 的迁移(ATTIC-175) | 2020-01 |
- 最后版本 1.3.8:Maven Central
maven-metadata.xml的<lastUpdated>20180322050336</lastUpdated>,即 2018-03 发布,此后再无版本; - 官网 ode.apache.org 仍可访问(由 Attic 托管静态页),Downloads 指向 https://archive.apache.org/dist/ode/ (存在 apache-ode-war-1.3.8.zip);
- 退役后无任何版本发布、缺陷修复与安全补丁,暴露在外的 SOAP 端点应按遗留系统对待(网络隔离、访问控制)。
三、核心概念(以官方文档为准)
(本节为概念介绍,帮助读懂第四、五章实测;细节以 Attic 托管的官方文档为准。)
- process(流程):BPEL 的部署与执行单元。一个
.bpel文件描述流程逻辑,配合.wsdl描述流程对外暴露与依赖的服务接口。本文实测的 HelloWorld2 即由 HelloWorld2.bpel + HelloWorld2.wsdl + deploy.xml 组成。 - deploy.xml(部署描述符):随流程一起打包的部署描述文件,把 BPEL 流程绑定到具体的 WSDL 服务与端口。实测中 HelloWorld2 的 deploy.xml 将服务 HelloService/HelloPort 绑定为
/ode/processes/helloWorld访问地址(5.4 节调用即走该地址)。 - Partner Link(伙伴链接):BPEL 中声明流程与外部服务交互的引用点,是流程调用外部服务或接收回调的"接口插口"。
- 同步与异步流程:同步流程在请求-响应式 SOAP 调用中直接返回处理结果(5.4 节实测即同步流程);异步流程则立即应答、后续经回调地址继续交互(概念,本文未实测)。
- 部署模型(1.3.8 war 实测口径):引擎启动后对
/opt/tomcat/webapps/ode/WEB-INF/processes路径做部署轮询(4.4 节日志),同时提供 SOAP 部署端点 DeploymentService(5.3 节实测)。裸 zip-POST 部署端点在 1.3.8 war 上不存在(5.2 节两个失败实录),与部分旧文档描述不一致。
四、安装部署
4.1 Maven 发布物核实(重要:坐标与发布物形态的坑)
经 Maven Central 核实(2026-10-15):
- 坐标
org.apache.ode:ode-war不存在:https://repo1.maven.org/maven2/org/apache/ode/ode-war/maven-metadata.xml返回 404; - 真实坐标是
org.apache.ode:apache-ode-war,其https://repo1.maven.org/maven2/org/apache/ode/apache-ode-war/maven-metadata.xml实测内容:
<latest>1.3.8</latest>
<release>1.3.8</release>
versions: 1.2, 1.3.5, 1.3.6, 1.3.7, 1.3.8
<lastUpdated>20180322050336</lastUpdated>
- 关键坑:
org.apache.ode:apache-ode-war:1.3.8的发布物是 zip 包,Central 上没有 .war 直发。https://repo1.maven.org/maven2/org/apache/ode/apache-ode-war/1.3.8/目录下只有.pom与.zip;apache-ode-war-1.3.8.zip(50,787,383 字节)内含ode.war(41,260,034 字节)+examples/+sql/+lib/; - 另一坐标
org.apache.ode:apache-ode-distro在 Central 最高只有 1.3.6(1.3.8 未发布 distro)——直接用 war zip 即可,其 examples/ 自带三个示例:HelloWorld2、DynPartner、MagicSession。
即:下载 apache-ode-war-1.3.8.zip(archive.apache.org/dist/ode/ 与 Maven Central 均可取),解包得到 ode.war 与 examples/(本文解包至 /root,示例位于 /root/examples/)。
4.2 准备 JDK 8 与 Tomcat 9
apt-get install -y openjdk-8-jdk
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.123/bin/apache-tomcat-9.0.123.tar.gz
tar xzf apache-tomcat-9.0.123.tar.gz -C /opt
mv /opt/apache-tomcat-9.0.123 /opt/tomcat
版本确认输出见第一章(Server version: Apache Tomcat/9.0.123)。
4.3 部署 ode.war 并启动
将解包得到的 ode.war 放入 /opt/tomcat/webapps/,指定 JDK 8 启动 Tomcat:
cp ode.war /opt/tomcat/webapps/
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 /opt/tomcat/bin/catalina.sh start
Tomcat 侧部署日志实测:
14-Oct-2026 19:35:14.020 INFO [main] HostConfig.deployWAR Deploying web application archive [/opt/tomcat/webapps/ode.war]
14-Oct-2026 19:35:21.252 INFO [main] HostConfig.deployWAR Deployment of web application archive [/opt/tomcat/webapps/ode.war] has finished in [7,232] ms
14-Oct-2026 19:35:21.492 INFO [main] Catalina.start Server startup in [7,520] milliseconds
war 部署约 7.2 秒完成;JDK 8 + Tomcat 9.0.123 + ODE 1.3.8 组合无需任何兼容性处理(实测结论)。
4.4 引擎日志与管理台验证
关键坑:ODE 引擎日志不在 catalina.out,而在 /ode.log。 ODE 使用 log4j2 File appender、相对路径(相对启动进程的工作目录,本次 catalina.sh 从 / 启动,故落在根目录 /ode.log);catalina.out 中没有任何 ODE 行。/ode.log 实测关键行:
19:35:19,593 INFO [ODEServer] Using DAO Connection Factory class org.apache.ode.dao.jpa.BPELDAOConnectionFactoryImpl.
19:35:20,228 INFO [JdbcDelegate] Using database Apache Derby major version 10
19:35:20,229 INFO [JdbcDelegate] Using database dialect: DERBY
19:35:20,882 INFO [BpelServerImpl] BPEL Server Started.
19:35:21,238 INFO [DeploymentPoller] Poller started.
19:35:21,238 INFO [ODEServer] Process deployment polling started on path /opt/tomcat/webapps/ode/WEB-INF/processes.
19:35:21,238 INFO [ODEServer] ODE Service Engine has been started.
- 内嵌数据库:默认使用内嵌 Apache Derby。
/derby.log实测出现Booting Derby version ... 10.5.3.0 - (802917) ... on database directory /opt/tomcat/webapps/ode/WEB-INF/derby-jpadb;war 内WEB-INF/conf/ode-axis2.properties默认即ode-axis2.db.emb.type=derby、ode-axis2.db.emb.name=derby-jpadb(war 内另有 h2 目录,但默认未启用)。 - 管理台:
curl http://localhost:8080/ode/返回 HTTP 200,是 AngularJS 版 Apache ODE Console 页面(<title>Apache ODE Console</title>,ng-app="ode-console")。 - 端点空间预期行为:
curl http://localhost:8080/ode/processes/(空 GET)返回 HTTP 500,AxisFault:The service cannot be found for the endpoint reference (EPR) /ode/processes/——该路径是 SOAP 端点空间,直接 GET 报错属预期,不是故障。
五、上手实测:部署并调用 HelloWorld2
5.1 示例打包
ode-war zip 自带 examples/(HelloWorld2 / DynPartner / MagicSession),本文使用 HelloWorld2。打包命令(4 个文件必须位于 zip 根部):
cd /root/examples/HelloWorld2 && zip /root/hello.zip HelloWorld2.bpel HelloWorld2.wsdl deploy.xml testRequest.soap
即 hello.zip 内含 HelloWorld2.bpel、HelloWorld2.wsdl、deploy.xml、testRequest.soap 四个文件。
5.2 失败尝试实录(重要坑,勿重蹈)
尝试一:裸 zip POST 到 /ode/deploy → HTTP 404。
curl -H "Content-Type: application/zip" --data-binary @hello.zip http://localhost:8080/ode/deploy
404 原因:war 的 urlrewrite.xml 把 /** 重写到 ode-console 的 webjars,/deploy 不在任何 servlet 映射里。
尝试二:POST /ode/deployment/deploy/ 与 /ode/deployment/api/ → HTTP 500。(web.xml 把 /deployment/* 也映射给 AxisServlet)Axis2 把 zip 二进制当 SOAP XML 解析,报 WstxIOException: Invalid UTF-8 start byte 0xfc。
结论:ODE 1.3.8 war 没有裸 zip-POST 部署端点,必须走 SOAP DeploymentService(官方旧文档描述与实际不符,本次靠反编译 class 确认,见 5.3 节)。
5.3 正确方式:SOAP 调用 DeploymentService 部署
- 端点来自 war 内
WEB-INF/deploy.wsdl:<soap:address location="http://localhost:8080/ode/processes/DeploymentService"/>;rpc/literal,body 命名空间http://www.apache.org/ode/pmapi; - 报文结构经
javap -c反编译org.apache.ode.axis2.service.DeploymentWebService$DeploymentMessageReceiver逆向确认:
deploy(命名空间 http://www.apache.org/ode/pmapi,rpc/literal)
├── name (必须无命名空间)
└── package (必须无命名空间)
└── zip (必须为 http://www.apache.org/ode/deployapi 命名空间,内容为 zip 包的 base64 文本)
- 用 python3 构造 SOAP 1.1 请求 POST 到 DeploymentService,HTTP 200,真实回显:
<pmapi:deployResponse xmlns:pmapi="http://www.apache.org/ode/pmapi">
<response>
<deployapi:name xmlns:deployapi="http://www.apache.org/ode/deployapi">HelloWorld2-1</deployapi:name>
<deployapi:id ...>nsBd9e2:HelloWorld2-1</deployapi:id>
</response>
</pmapi:deployResponse>
- /ode.log 对应日志(关键行):
19:40:08,448 INFO [ProcessStoreImpl] Starting deployment of processes from directory "/opt/tomcat/webapps/ode/WEB-INF/processes/HelloWorld2-1".
19:40:08,850 INFO [BpelC] info: [CompilingProcess] Compiling BPEL process.
19:40:09,280 INFO [ProcessStoreImpl] Process {http://ode/bpel/unit-test}HelloWorld2-1 deployed from "{http://ode/bpel/unit-test}HelloWorld2-1".
19:40:09,623 INFO [BpelServerImpl] Registered process {http://ode/bpel/unit-test}HelloWorld2-1.
19:40:09,623 INFO [DeploymentWebService] Deployment of artifact HelloWorld2-1 successful.
- 通过 PMAPI
listDeployedPackages核对,回显:<deployedPackages><deployapi:name>HelloWorld2-1</deployapi:name></deployedPackages>。
5.4 SOAP 1.1 同步调用流程
- 请求:官方 examples 自带
testRequest.soap(SOAP 1.1,ns1:hello,TestPart="Hello"),POST 到http://localhost:8080/ode/processes/helloWorld(deploy.xml 服务 HelloService/HelloPort;wsdl soap:address 即此 URL),Header:Content-Type: text/xml; charset=utf-8、SOAPAction: ""; - 流程逻辑:HelloWorld2.bpel 的 assign 执行
concat($tmpVar,' World'); - HTTP 200 真实回显:
<odens:helloResponse xmlns:odens="http://ode/bpel/unit-test.wsdl">
<TestPart ...>Hello World</TestPart>
</odens:helloResponse>
端到端链路(SOAP 部署 → 编译 → 注册 → SOAP 调用 → BPEL 执行 → 响应)全部实测成功。
六、适用场景与局限(存量维护视角)
适用场景:
- 存量 BPEL 流程系统的维护与迁移评估——SOA/Hadoop 时代基于 ODE 的流程编排与流程集群部署,需要在受控环境中继续运行或理解其行为;
- 需在隔离内网中以 JDK 8 + Tomcat 9 维持既有 WS-BPEL 2.0 流程资产运行的场景(本文实测组合零改造可用);
- 对 BPEL 语言与流程引擎原理的学习研究(Attic 托管的文档与示例仍完整可取)。
局限与风险:
- 无任何维护与安全更新:最后版本 1.3.8 于 2018-03 发布,2019-08 退役决议、2020-01 完成迁移;SOAP 端点暴露面需按遗留系统管控;
- 文档与实际不一致:1.3.8 的部署端点与旧文档描述不符(5.2/5.3 节),存量运维需以实际 war 行为为准;
- 技术栈陈旧:JDK 8、Axis2、内嵌 Derby 10.5、AngularJS 管理台均为旧时代组件;
- 不适合新项目(新流程引擎选型请评估活跃维护的 BPMN 引擎等替代方案,本文未做替代品实测,以各自官方文档为准)。
七、常见问题(FAQ)
Q1:按旧资料引入 Maven 坐标 org.apache.ode:ode-war 失败?
该坐标在 Central 上是 404。真实坐标为 org.apache.ode:apache-ode-war:1.3.8,且发布物是 zip 包(内含 ode.war),Central 无 .war 直发;apache-ode-distro 最高只有 1.3.6(见 4.1 节)。
Q2:ODE 是什么时候进入 Apache Attic 的? 2019-08 董事会作出退役决议,2020-01 完成迁移(ATTIC-175)。(部分资料所称"2023 年左右入 Attic"不正确。)
Q3:curl --data-binary @hello.zip http://localhost:8080/ode/deploy 返回 404?
1.3.8 war 没有 /ode/deploy 端点(urlrewrite.xml 把 /** 重写到 ode-console webjars)。POST /ode/deployment/deploy/ 也不行(Axis2 把 zip 当 SOAP 解析,报 WstxIOException: Invalid UTF-8 start byte 0xfc)。正确方式是 SOAP POST /ode/processes/DeploymentService:zip 以 base64 放入 deployapi 命名空间的 zip 子元素,name/package 子元素必须无命名空间(见 5.3 节)。
Q4:为什么 catalina.out 里看不到 ODE 引擎日志?
ODE 自身日志走 log4j2 File appender、相对路径 ode.log(相对启动进程工作目录,本文为 /ode.log),catalina.out 中无 ODE 行;内嵌 Derby 日志在 /derby.log。
Q5:/ode.log 里的 ClassNotFoundException: org.apache.xml.serializer.TreeWalker 要处理吗?
实测为非致命告警(xalan 类加载顺序问题),不影响部署与流程执行,可忽略。
Q6:GET /ode/processes/ 返回 500 是不是部署失败?
不是。该路径是 SOAP 端点空间,空 GET 返回 AxisFault The service cannot be found for the endpoint reference (EPR) /ode/processes/ 属预期行为(见 4.4 节)。
Q7:JDK 8 + Tomcat 9 能直接跑 1.3.8 吗? 实测可以:openjdk 1.8.0_504 + Tomcat 9.0.123 + ode 1.3.8 war 组合无需任何兼容性 hack,war 约 7.2 秒部署完成,部署与调用全链路可用。
参考链接
- Attic 项目状态页:https://attic.apache.org/projects/ode.html
- 官网(Attic 托管静态页):http://ode.apache.org/
- 归档下载(含 apache-ode-war-1.3.8.zip):https://archive.apache.org/dist/ode/
- Maven Central(org.apache.ode:apache-ode-war):https://repo1.maven.org/maven2/org/apache/ode/apache-ode-war/
- Tomcat 9 归档下载:https://archive.apache.org/dist/tomcat/tomcat-9/