- jBPM5 教程
- jBPM5 - 首页
- jBPM5 - 概述
- jBPM5 - Eclipse 插件
- jBPM5 - Hello World!
- jBPM5 - 组件
- jBPM5 - 工作流组件
- 绘制和验证工作流
- jBPM5 - 示例
- jBPM5 有用资源
- jBPM5 快速指南
- jBPM5 - 有用资源
- jBPM5 - 讨论
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 重新启动。现在,转到窗口→首选项→Drools→Drools 流程节点
如果您能够看到上面屏幕截图中显示的节点,则证明插件已成功安装。现在我们准备编写我们的第一个 jBPM 程序。
jBPM5 - Hello World!
在本节中,我们将使用 jBPM 编写我们的第一个程序“Hello World”。请按照以下步骤操作 -
转到文件→新建→Drools 项目 -
点击下一步。为第一个项目提供一个合适的名称:在本例中为“HelloWorld”。
点击下一步。选中下面的两个复选框,即 -
- 将示例 HelloWorld 流程文件添加到此项目
- 添加用于加载和执行 HelloWorld 流程的示例类
点击下一步。点击配置工作区设置(在以下屏幕截图中标记为红色) -
点击添加按钮 -
点击添加按钮后,将出现以下屏幕。点击“创建新的 Drools5 运行时”
提供到您已下载 droolsjbpm-tools-distribution-5.3.0.Final.zip 的二进制文件文件夹的路径
然后,选择已安装的 Drools 运行时并点击确定。
出现以下屏幕。点击完成按钮。
现在,在 Eclipse 中打开包资源管理器视图。您将看到以下屏幕 -
ProcessTest.java 类是加载规则流 (rf) 文件的类,而ruleflow.rf 是为 HelloWorld 项目创建的基本规则流。
双击ruleflow.rf 文件,您将看到以下规则流 -
绿色圆圈表示工作流的开始,而红色圆圈表示工作流的结束。
左侧显示的面板列出了工作流中使用的不同组件。除了开始和结束之外,还有许多其他组件可用于工作流,我们将在下一节中介绍它们。
开始和结束事件之间的 Hello 是一个脚本任务,脚本任务的名称为Hello。要查看脚本任务“Hello”中编写了哪些代码,请转到窗口→显示视图→其他→属性。
注意 - 在使用 jBPM 时,请始终保持属性视图打开,因为所有配置都仅在属性视图中可见。
点击确定按钮。现在,选择Hello,您就可以看到“Hello”事件的属性 -
要查看“Hello”事件中编写的全部代码,请选择操作属性。
红色标记的圆圈是操作属性的编辑。单击编辑后 -
您可以编辑它并编写要在“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 中可用的各种工作流组件。使用这些组件,您可以创建工作流来协调您的流程。
您也可以创建自定义任务,但将在后面介绍。此外,还提供服务任务,可用于协调流程。
开始事件 - 这是每个流程中执行的第一个节点。您的流程中只能有一个开始节点。
结束事件 - 此节点表示流程的结束。在一个流程中,此类型的节点可以出现多次。
规则任务 - 它是一个评估规则流组的节点,即同一命名范围下一组 Drools 规则。
网关(发散)又名分割 − 此节点在流程中创建新的路径/分支。它有两个或多个输出连接。您可以选择三种不同的分割/网关类型。
与门(AND GATE) − 流程同时继续到所有输出连接。
异或门(XOR GATE) − 根据工作流中定义的一些预定义约束,仅转到一条输出路径。
或门(OR GATE) − 流程基于所有输出约束的评估继续执行,并在约束评估为 true 的路径上启用。
网关(汇聚)又名合并 − 此合并是分割的反向操作。它将多条路径合并为一条。可以有四种不同的合并/网关类型 −
与(AND) − 当所有分支都完成后,流程继续执行。
异或(XOR) − 当至少一个分支完成后,流程继续执行。
区分器(Discriminator) − 与异或类似,如果其中一个分支已完成,则继续执行。但与异或不同的是,它会注册其他分支的完成情况,直到所有连接都完成。发生这种情况时,节点将重置,并且当传入分支激活时可以再次进入,循环重新开始。
N-of-M − 当 m 个分支中的 n 个分支完成后,流程继续执行。在配置网关时,您需要指定 n(数量),即在流程退出之前应完成多少个分支。
可重用子流程 − 调用另一个流程。这对于将多个较小的流程组合成一个较大的流程非常有用。这个较大的流程可以是一个协调流程。您可以配置调用流程以等待被调用流程完成,并且使其具有与其父流程独立的生命周期。
脚本任务 − 可以执行简单代码片段的节点。
定时器事件 − 此类型的节点启动一个定时器,并在定时器到期时触发。启用时间相关的流程和重复性任务。
错误事件 − 此类节点表示流程中的错误条件。它没有输出连接。它指定一个 FaultName 和一个 FaultVariable。引擎将搜索与 FaultName 匹配的异常处理程序,并将 Fault 信息存储在 FaultVariable 定义的变量中。
消息事件 − 当发出预定义类型的事件时触发。它可以是内部事件(在流程内部发出信号)或外部事件(由流程引擎以外的外部实体发出信号)。
用户任务 − 创建人工任务的节点。此人工任务是必须由人工执行者完成的活动。
嵌入式子流程 − 有助于在父流程中创建子流程。它可以有自己的作用域。这对于较大的流程很有用,在这些流程中您希望将一些复杂的分支隔离。它可以有自己的变量和异常处理程序。
多实例又名ForEach − 它允许将元素集合馈送到子流程中。与可重用子流程结合使用时,在组合和协调较小的流程方面非常有用。
jBPM5 - 绘制和验证工作流
要绘制工作流,您可以使用调色板中提供的任何组件,如上文所述。所有工作流都将有一个开始节点,但可以有多个结束节点。
借助屏幕截图,我将向您展示如何创建工作流。
在这里,我打开了空白的 rf 或 bpmn 文件。
要添加任何事件,请从组件调色板中选择特定的事件,然后将其拖放到右侧。例如,我选择了开始事件并将其拖放到右侧,以及一个发散网关。
现在,需要连接这两个组件。选择顺序流并连接这两个组件。
通过这种方式,您可以将组件拖到编辑器中,并使用顺序流来连接不同的组件。只需要注意,某些组件将只有一个传入连接和一个传出连接,并且需要相应地设置顺序流以创建有意义的流程。
在绘制工作流时,还需要设置一些属性。我将在这里发布所有要设置的属性。我刚刚创建了一个流程,但最初看起来并没有什么意义,因为我没有在创建的工作流中设置任何属性。
如上所示,这是一个没有任何描述的空白工作流,并且无法从创建的工作流中看出任何内容。
但是,为了进一步解释,我有一个开始组件,然后是一个发散网关,根据发散网关的条件,我将选择一条路径并在脚本任务中执行一些代码,然后结束工作流。因此,我需要为发散网关、脚本任务和汇聚网关设置属性。
在此阶段,我还将向您展示我的工作流存在一些错误,稍后将向您展示,一旦我设置了属性,我的工作流将不再有任何错误,从而向您展示如何验证创建的工作流。
提示 − 请记住,验证器在 Windows → 首选项 → 验证下开启。
下面的屏幕截图显示了 Eclipse 中的设置。
根据屏幕截图,您可以看到有 4 个错误。第一个错误指出脚本没有操作,然后另一个错误是定义的网关没有定义类型。因此,我们需要消除这些错误才能运行工作流。
我们现在将逐一设置属性,并观察错误逐渐消失。
选择第一个网关(发散),单击属性,然后单击类型,并根据您的需求选择网关。
选择网关后,需要选择一个约束。
单击标记为红色的圆圈,您将看到下面的屏幕截图。
单击编辑并根据屏幕截图填写详细信息 −
单击导入,并导入将在其上执行任何操作的类。在屏幕截图中,我们导入了将在我们的示例中使用的乘客 POJO。
类似地,为另一个约束填写详细信息 −
现在,单击确定按钮。
再次单击确定。现在,选择脚本任务并执行与您对发散网关所做的相同操作。
我们只是添加了一个 SOP(打印语句)来显示流程。任何 Java 或 MVEL 代码都可以在脚本任务中编写。
类似地,为第二个约束添加代码 −
最后,需要为发散网关添加网关类型。
现在,保存工作流文件并转到问题视图。所有问题都将得到解决。
问题视图中没有错误表明创建的工作流中没有错误。这就是在 jBPM 中创建和验证工作流的方式。
jBPM5 - 示例
我们将在本章中举一个例子来解释如何将 jBPM 应用于实践。手头的任务是使用 jBPM 根据乘客的收入来决定乘客是乘坐飞机还是火车。
创建项目的步骤与“Hello World”项目相同。在编辑器中打开 .rf 文件,并查看标记为红色的更改 −
在这里,我们更改了规则流 ID(唯一)并添加了一个变量 income,因为我们将根据乘客的收入来决定路线。
如何设置变量 − 选择标记为红色的编辑按钮。
点击添加按钮 -
将弹出以下屏幕 −
将名称设置为 income,类型设置为 Integer。
单击确定。您将看到现在定义了 income 变量。
在 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("income", 900); 并重新运行该类,查看输出的变化。