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 ODEODEApacheJavaBPEL2026/10/15

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 秒部署完成,部署与调用全链路可用。

参考链接