jBPM5 - 快速指南
jBPM5 - 概述
JBPM 代表“Java 业务流程管理”。它是 JBoss 产品,是一个开源框架。在进一步讨论之前,我们首先定义一个业务流程。
什么是业务流程?
根据定义,业务流程是按可重复顺序发生的一系列任务,由人员和/或系统执行以实现业务目标。它描述了需要执行的一系列步骤的顺序(使用流程图)。业务流程可以显着提高业务逻辑的可见性和敏捷性。
让我们举个例子。以下屏幕截图描述了大多数 IT 专业人员都可以理解的工作流程/流程图。这是大多数组织都遵循的根据员工绩效评估员工的常见流程。

该过程按以下顺序进行 -
员工自我评估并将报告提交给项目经理。
然后,项目经理和人力资源经理将对您的表现进行评估。根据评估,他们给员工评分。
最终的评级或绩效反馈随后会转发给员工。
这个流程几乎适用于所有员工,因此,它是理解业务流程的一个很好的例子。它是一系列任务,并且按特定顺序发生。
jBPM是什么?
业务流程是理解任何组织框架的关键概念。像 jBPM 这样的技术有助于以有效的方式管理复杂的业务流程。JBPM是一个可以有效编排业务流程的工具。一般来说,每个企业级应用程序都会有一系列按特定顺序执行的任务,并且可以在 jBPM 的帮助下编排这些流程。
jBPM 的美妙之处在于它类似于流程图。业务分析师也可以轻松理解它。jBPM 可以嵌入到 Java 应用程序中并作为服务运行。
JBPM的特点
jBPM 是一个用 Java 编写的轻量级、开源、完全嵌入式流程引擎。其最显着的特点如下:
jBPM 执行使用 BPMN 2.0 规范设计的业务流程。
jBPM 可以与 Eclipse 和类似的 IDE 完全集成,以提供拖放支持来创建工作流程。
jBPM 拥有可让业务分析师和用户从设计阶段就参与进来的 UI 工具。
jBPM 在 JPA 和 JTA 的帮助下支持持久性和事务管理。
人们可以定义自定义工作项处理程序来创建用户定义的任务,该任务稍后可以用作其他工作流程的组件。
jBPM5 - Eclipse 插件
以下是安装 jBPM 插件的先决条件 -
- Java 1.5(或更高版本)SE JDK
- Eclipse 4.2 或任何版本以及 jBPM 插件
由于 jBPM 是用 Java 编写的,因此我们将在本节中介绍如何添加所需的插件。考虑到大多数Java用户使用Eclipse,让我们看看如何在Eclipse中添加jBPM插件。
从以下链接下载二进制文件 - http://download.jboss.org/drools/release/5.3.0.Final/
看到这里的 Drools 时不要感到困惑。jBPM 使用相同的插件。如果您已经安装了 Drools 插件,那么您可以跳过安装步骤。

将其解压到您的硬盘上。然后,启动 Eclipse 并转到“帮助”→“安装新软件”。

单击添加存储库-

单击“本地”按钮,然后选择“.../binaries/org.drools.updatesite”(您在计算机上下载的位置)

选择Drools 和 jBPM,然后单击“下一步”按钮。

再次单击“下一步”并选择“我接受许可协议的条款”,然后单击“完成”。软件安装开始 -

安装成功后,您将看到以下对话框 -

单击“是”。Eclipse 重新启动。现在,转到Windows → 首选项 → Drools → Drools 流节点

如果您能够看到如上图所示的节点,则证明插件已成功安装。现在我们准备编写我们的第一个 jBPM 程序。
jBPM5 - 世界你好!
在本章中,我们将使用 jBPM 编写第一个程序“Hello World”。请按照以下步骤操作 -
转到文件 → 新建 → Drools 项目 -

单击“下一步”。为第一个项目指定一个适当的名称:在我们的例子中为“HelloWorld”。

单击“下一步”。选择底部的两个复选框,即 -
- 将示例 HelloWorld 流程文件添加到此项目
- 添加用于加载和执行HelloWorld进程的示例类

单击“下一步”。单击配置工作区设置(在以下屏幕截图中标记为红色) -

单击添加按钮 -

单击“添加”按钮后,将出现以下屏幕。单击“创建新的 Drools5 运行时”

提供下载droolsjbpm-tools-distribution-5.3.0.Final.zip的二进制文件夹的路径
然后,选择已安装的 Drools 运行时并单击“确定”。

出现以下屏幕。单击完成按钮。

现在,在 Eclipse 中打开 Package Explorer 视图。您将看到以下屏幕 -

ProcessTest.java类是加载ruleflow(rf) 文件的类,ruleflow.rf是为HelloWorld 项目创建的基本规则流。
双击ruleflow.rf文件,您将看到以下规则流 -

绿色圆圈表示工作流程的开始,而红色圆圈表示工作流程的结束。
左侧所示的面板列出了工作流程中使用的不同组件。除了 START 和 END 之外,还有很多组件可以在工作流程中使用,我们将在下一节中介绍它们。
START 和 END 事件之间的 Hello 是一个脚本任务,脚本任务的名称是Hello。要查看脚本任务“Hello”中编写了哪些代码,请转到 Windows → 显示视图 → 其他 → 属性。

注意- 在使用 jBPM 时,请始终保持属性视图打开,因为所有配置仅在属性视图中可见。
单击“确定”按钮。现在,选择Hello,您可以看到“Hello”事件的属性 -

要查看“Hello”事件中编写的完整代码,请选择“ Action”属性。

红色标记的圆圈是操作属性的编辑。单击编辑后 -

您可以编辑此内容并在“Hello”脚本任务中编写要执行的代码。让我们编辑它 -

单击“确定”。现在打开 ProcessTest.java 类并将其作为 Java 应用程序运行。下面给出的是它的输出 -

ProcessTest.java 类中使用的术语与 Drools 中使用的术语相同。ProcessTest.java 类中需要注意的一点是 -
ksession.startProcess("com.sample.ruleflow");
当您编写启动流程的代码时,传递给startProcess方法的字符串是我们打开工作流程时的 id 属性。

jBPM5 - 组件
BPMS核心是BPM的心脏。下图描述了 BPMS 核心及其组件。

语义模块
语义模块定义语言语义(每个单词的含义)以及如何将其翻译为准备执行的流程引擎的内部结构。该模块基本上包含了理解 BPMN2 语言的要点。
流程引擎
流程引擎是负责实际执行我们的业务流程的引擎。流程引擎负责创建新的流程实例并保存每个实例的状态。在流程引擎代码内部,定义了内部结构来表示流程定义中的每个活动。用于实例化这些流程定义的所有机制都将按照流程引擎中的定义来执行它们。
持久化和事务
在大多数企业应用程序中,所有交互都必须在事务边界内运行,并且我们必须处理不同的系统、API 和设计。此外,我们必须有一个灵活的机制来定义 -
如何处理长时间运行的进程
我们如何以及何时存储有关流程状态的信息以及流程正在处理的信息
我们需要如何以及何时创建、提交或回滚流程引擎事务
哪些业务异常可以回滚或补偿已经执行的业务操作
jBPM 内的持久性和事务组件涵盖了上述所有要点。
审计/历史日志
该模块负责为用户提供一种查询流程执行情况的方法。此信息包括有关已结束的进程的历史信息和有关正在执行的进程的最新信息。
业务活动监控 (BAM)工具和信息仪表板是此模块生成的信息的一些最常见的客户端。审核/历史日志模块通常用于提取有用的信息和指标,这些信息和指标将与旨在相应显示此信息的不同工具协作。
jBPM5 - 工作流程组件
以下屏幕截图显示了 jBPM 5 中可用的各种工作流组件。使用这些组件,您可以创建一个工作流来编排您的流程。

您也可以创建自定义任务,但这将在稍后介绍。此外,还有一些可用的服务任务可用于编排流程。
开始事件- 这是每个进程中执行的第一个节点。您的流程中只能有一个起始节点。
结束事件- 该节点表示流程结束。一个流程中可以多次出现此类节点。
规则任务- 它是评估 RuleFlow 组的节点,即同一命名范围下的一组 Drools 规则。
网关(发散)又名分裂- 这个特定节点在此过程中创建新的路径/方式。它有两个或多个传出连接。您可以在三种不同类型的可用分割/门之间进行选择。
AND GATE - 流程流同时继续到所有传出连接。
异或门- 根据工作流程中定义的一些预定义约束,仅进入一个传出路径。
或门- 流程根据所有传出约束的评估进行,并且在约束评估为 true 的情况下启用该路径。
网关(汇聚)又名加入- 这种加入是分裂的逆过程。它将多条路径合并为一条。可以有四种不同类型的连接/门 -
AND - 当所有分支完成时流程继续。
XOR - 当至少一个分支完成时流程继续。
判别器- 与 XOR 类似,如果其分支之一已完成,则判别器继续。但与 XOR 不同的是,它会记录其他分支的完成情况,直到所有连接完成为止。当发生这种情况时,节点会重置,并且当传入分支激活时可以再次进入该节点,并且循环重新开始。
N-of-M - 当n 个m分支完成时,流程继续。您需要在配置门时指定n (数字),以确定在流退出之前应完成多少个分支。
可重用子流程- 调用另一个流程。这对于将几个较小的进程组合成一个较大的进程非常有用。这个更大的过程可以是一个协调过程。您可以将调用进程配置为等待被调用者完成,并拥有与其父进程独立的生命周期。
脚本任务- 可以执行一段简单代码的节点。
计时器事件- 这种类型的节点启动计时器并在计时器到期时触发。启用与时间相关的流程和重复任务。
错误事件- 这种节点在过程中发出错误信号。它没有传出连接。它指定了一个FaultName 和一个FaultVariable。引擎将搜索与FaultName匹配的异常处理程序,并将Fault信息存储在FaultVariable定义的变量中。
消息事件- 当发出预定义类型的事件时触发。它可以是内部事件(在流程内部发出信号)或外部事件(由流程引擎以外的外部实体发出信号)。
用户任务- 创建人工任务的节点。此人工任务是必须由人类参与者完成的活动。
嵌入式子流程- 帮助在父流程中创建子流程。它可以有自己的范围。这对于您想要隔离一些复杂分支的大型流程非常有用。它可以有自己的变量和异常处理程序
Multiple Instances aka for Each - 它允许将元素集合输入到子流程中。与可重用子流程结合使用来组成和协调较小的流程时非常有用。
jBPM5 - 绘制并验证工作流程
要绘制工作流程,您可以使用调色板中可用的任何组件,如上面的文章所述。所有工作流程都有一个起点,但可以有多个终点。
在屏幕截图的帮助下,我将向您展示如何创建工作流程。
在这里,我打开了空白的rf或bpmn文件

要添加任何事件,请从组件面板中选择特定事件并将其拖放到右侧。例如,我选择了开始事件并将其拖动到右侧以及发散网关。

现在,需要连接两个组件。选择序列流并连接两个组件。


这样您就可以将组件拖到编辑器中并使用序列流来连接不同的组件。只需要注意某些组件只有一个传入连接和一个传出连接,并且需要相应地设置顺序流以创建有意义的流。
当我们绘制工作流程时,还需要设置一些属性。将在此处发布要设置的所有属性。我刚刚创建了一个流程,但第一时间查看它并没有多大意义,因为我尚未在创建的工作流程中设置任何属性。

正如您在上面所看到的,这是一个空白的工作流程,没有任何描述,并且无法从创建的工作流程中看出任何内容。
然而,为了进一步解释,我有一个启动组件,然后有一个发散网关,根据发散网关的情况,我将选择一种方式并在脚本任务中执行一些代码,然后结束工作流程。因此,我需要设置发散网关的属性,然后设置脚本任务和聚合网关的属性。
在此阶段,我还将向您展示我的工作流程有一些错误,稍后将向您展示一旦我设置属性,我的工作流程中就不会出现错误,从而向您展示如何验证创建的工作流程。
提示 - 请记住验证器在 Windows → 首选项 → 验证下打开
下面的截图显示了 eclipse 中的设置。


根据屏幕截图,您可以看到有 4 个错误。第一个错误表示脚本没有任何操作,然后另一个错误是网关的定义没有定义类型。因此,我们需要删除这些错误才能运行工作流程。
现在,我们将一一设置属性,然后看到错误逐渐消失。
选择第一个网关(发散)并单击属性,然后单击类型并根据您的要求选择门。

选择网关后,您需要选择一个约束。

点击红色圆圈,您将看到下面的屏幕截图

单击编辑并根据屏幕截图填写详细信息 -


单击“导入”并导入我们将对其执行任何操作的类。在屏幕截图中,我们导入了乘客 POJO,我们将在示例中使用它。

同样,填写另一个约束的详细信息 -

现在,单击“确定”按钮。

再次单击“确定”。现在,选择脚本任务并执行与分歧网关相同的过程。
我们刚刚添加了一个 SOP(打印语句)来显示流程。任何java或mvel代码都可以写在脚本任务中。

同样添加第二个约束的代码 -

最后,您需要添加分流网关的网关类型。

现在,保存工作流程文件并转到问题视图。所有的问题都会得到解决。

问题视图中没有错误表明创建的工作流程中没有错误。这就是在 jBPM 中创建和验证工作流程的方式。
jBPM5 - 示例
本章我们将通过一个例子来解释如何将jBPM付诸实践。手头的任务是使用 jBPM 来根据乘客的收入决定是否搭乘航班或火车。
创建项目的步骤与“Hello World”项目相同。在编辑器中打开 .rf 文件,并查看以红色标记的更改 -

在这里,我们更改了规则流 ID(唯一)并添加了可变收入,因为我们将根据乘客的收入来决定路线。
如何设置变量- 选择红色标记的编辑按钮。

单击添加按钮 -

弹出以下屏幕 -

将名称设置为收入,并将类型设置为整数。

单击“确定”。您将看到现在定义的收入变量。

要在 ProcessTest.java 类(加载和运行进程的类)中完成的更改 -

Map<String, Object> params = new HashMap<String, Object>(); params.put("income", 1200); // start a new process instance ksession.startProcess("vivek.ruleflow", params);
您需要创建一个 MAP 并设置 MAP 中的值并将该值传递给 startProcess 重载方法。如图所示,我们更改了规则流 id,因此在 startProcess 方法中使用了相同的 id (vivek.ruleflow)。
在运行 ProcessTest.java 类之前,在与 ProcessTest.java 相同的包中创建 POJO Passenger.java
public class Passenger { private String name; private int income; Getters and setters here }
现在将 ProcessTest.java 类作为 Java 应用程序运行并查看输出 -

更改值- params.put(“收入”, 900); 并重新运行该类并查看输出的变化。
