JBPM 7.17 学习笔记(2)workbench

学习 jBPM 的第一步,是学习它的 workbench。
workbench 是 jBMP 的基于 web 的一系列工具集,也就是你用 ant start.demo 起起来的那个服务器。一旦启动了 workbench,你就可以用 http://localhost:8080/jbpm-console/来访问它。

Workbench 主界面

workbench 默认的管理员密码是 admin/admin。登陆后的主界面是这样的:
JBPM 7.17 学习笔记(2)workbench

顶部工具栏分别是:

  • 左上角:

    • 首页,也就是当前页
    • 菜单,包含了常用到的大部分功能,实际上是首页各项功能的一个快速链接。也是我们使用得最多的地方。
  • 右上角:

    • 案例管理,也就是 http://localhost:8080/jbpm-casemgmt/
    • 关于,目前没有任何任何内容
    • 设置,包括最重要的就是用户、组和权限管理
    • 重置布局,也就是当你将布局弄乱之后,可以用它来恢复默认布局。
    • 登录,用来显示登录用户和退出登录。

主界面中有 4 个图标,从左至右分别是:

  • 设计,主要是项目和 asset 的管理,包括新建项目,asset 的导入导出、编辑流程图等。
  • 发布,发布流程定义和服务器实例。
  • 管理,管理流程对象,比如新建流程实例,查询流程定义、流程实例、任务和错误。
  • 报表,包括查看待办、流程报表和任务报表。

新建用户

一个流程中经常需要不同用户角色的参与。因此我们首先用到的功能的就是用户管理。点击右上角的“设置”图标(齿轮图标),点击用户->New 用户,就可以新建用户。

依次新建 4 个用户:zhangsan1、lisi1、wangwu、zhaoliu。

注意,用户的组中必须分配一个 kie-server,角色可以是 user,用户名不能是中文或者 zhangsan、lisi 等常见名称,否则可能无法登录。

创建好用户,点击 Save 保存,你就可以用这个用户登录 workbench 并办理任务。

新建项目

点击 Menu -> Design -> Projects,进入项目设计界面。默认项目列表是空的,但你可以导入一些官方代码库中的示例,也可以自己新建一个项目。

点击 Add Project,创建项目。输入项目名称 get-started
,点添加,就可以创建一个项目。

刚刚新建的项目,没有 asset,你可以通过 Import Asset 导入 asset,也可以 Add Asset 手动添加 Asset。后者的好处是你可以用 workbench 中提供的流程设计器绘制流程图。workbench 提供的流程设计器比 Eclipse 可是好用多了,所以我们选择 Add Asset。会弹出一个列表,选择 Business Process,绘制流程图。

然后让你输入流程名称,比如 leaveprocess,以及包名:com.myspace.get_started。

这个 id 和 packageName 很关键,后面如果要 import 该 asset 时,文件名必须和 id 匹配。比如 id 叫做 get-started.test,那么文件名只能叫做 test.bpmn。

点击确定,进入流程设计器。

JBPM 7.17 学习笔记(2)workbench

接下来我们绘制一个最常见的请假流程。

绘制流程图

新建的流程图默认有一个开始节点,点击这个节点,选择 Create Parallel,创建一个网关。然后选择 Convert into Exclusive,转换成排他性网关(即网关 type 为 XOR)。

JBPM 7.17 学习笔记(2)workbench

图中有一个错误,即图上的网关图标还是并行网关的图标(+ 号),正确的做法是要把它转换成排他性网关( x 号)。

点击 Create Task,创建任务,然后选择 Convert into User,转换成用户任务。

JBPM 7.17 学习笔记(2)workbench

双击这个用户任务,将名称修改为提交申请

点击 Create Task,再次创建一个 User Task,命名为Leader审批

JBPM 7.17 学习笔记(2)workbench

继续绘制剩下流程图。包括:

  1. 3 个排他性网关,一个位于 Leader审批之后,两个位于 Director审批之后。
  2. 2 个 User Task Director审批HR备案
  3. 一个 End 节点。

为了方便查看,我们也稍微调整了节点的位置,最终效果如下:

JBPM 7.17 学习笔记(2)workbench

配置流程变量

在空白地方单击,打开右边的属性面板,点击 Process Variables 下边的 + 按钮,添加如下流程变量:

JBPM 7.17 学习笔记(2)workbench

配置网关

既然。网关,就不可能只有一个入口和一个出口,接下来为每个网关添加其它出口或入口。

  1. 第一个网关

    这个网关用来回到提交申请节点。之所以要用这个网关,是因为 BPMN 2.0 规定普通节点只能有一个入口和一个出口。因为提交申请这个节点有可能会有多个子流程进入这个节点:

    • 当流程启动后,流程引擎会自动进入提交申请节点。
    • Leader审批 时,如果Leader 不同意申请,进行了驳回操作,那么流程也会自动回到提交申请节点。
    • Director审批时,如果 Director 不同意申请,进行了驳回操作,那么流程也会自动回到提交申请节点。

    因为 BPMN 2.0 中任务节点只能有一个入口,那么对于这种有多个入口的情况,只能借助于网关实现了。所以第一个网关的作用就是为提交申请节点增加多个入口。

    第一个入口已经有了,我们需要增加另外 2 个入口。因此需要绘制另外两根线(即Sequence Flow)。

    首先从第二个网关( Leader审批之后的网关)画一根线到第一个网关,并命名为leader驳回

    JBPM 7.17 学习笔记(2)workbench

    打开属性面板,将分支条件设置为 leaderAgree==false:

    JBPM 7.17 学习笔记(2)workbench

    再从第三个网关(Director审批之后的网关)画一根线到第一个网关,命名为director驳回

    JBPM 7.17 学习笔记(2)workbench

    打开属性面板,将分支条件设置为 directorAgree==false:

    JBPM 7.17 学习笔记(2)workbench
  2. 第二个网关

    这个网关是leader审批节点执行后的分支。这个分支有三个出口:

    • leader 驳回。回到第一个网关(上面已经实现)。
    • leader 同意,同时请假天数 days >= 3,那么流转到Director审批节点(已经画出来了,但还没有配置条件表达式)。
    • leader 同意,同时请假天数 days < 3,那么流转到HR备案节点前面的网关(因为HR备案节点不能有两个入口,所以借用了一个网关实现)。

    第一个出口在前面已经实现。我们来看第二个出口,选中这根线,打开属性面板,设置 name 为leader同意,days>=3,然后设置条件表达式为return KieFunctions.isTrue(leaderAgree&&days>=3);

    JBPM 7.17 学习笔记(2)workbench

    有的条件比较复杂,不再是对单个的流程变量值进行计算,那么我们可以使用表达式来实现。不要怀疑,这个表达式是真正的 java 语句(也可以是其它语言)。

    第三个出口还没有画。从第二个网关画一条线到第四个网关(注意,不是第三个),命名为leader同意,days<3,然后将条件表达式设为return KieFunctions.isTrue(leaderAgree&&days<3);

    JBPM 7.17 学习笔记(2)workbench
  3. 第三个网关

    这个网关有两个出口,第一条分支director驳回已经配置好,只需要配置第二条分支的 Name 属性和条件表达式即可:

    JBPM 7.17 学习笔记(2)workbench
  4. 第四个网关

    这个网关有两个入口,两个入口都在上面的步骤中配置好了,不用再配置。

变量赋值及任务分配

全局变量和局部变量

前面已经设置了流程变量,流程变量是一种全局变量,在整个流程生命周期(无论是哪个节点)都可见。除此之外还有任务变量的概念,即局部变量,任务变量是在 Task 中使用的变量,它们的作用域只在于任务的生命周期,当任务结束,任务变量就销毁。

任务变量用于在执行任务(尤其是 User 任务)时存储任务办理时需要使用到的值,比如搜集用户输入。

提交申请为例。这个任务需要读取一些数据,比如 reason(事由)、date(请假日期)、days(请假天数),这些数据已经声明为流程变量。另外这个任务还会写入一些数据,比如 applicantSubmit(标志申请是否已经提交)。

因此任务变量分成了两种:输入及输出。这些变量的赋值统一放在了属性面板的 Assignment 中进行,并分为了数据输入及分配以及数据输出及分配两种,分别对应输入变量输出变量

任务变量的赋值及任务分配

1.提交申请节点。点击属性面板中的Assignments(赋值)。弹出一个对话框。通过 + 按钮,分别对输入变量输出变量进行如下赋值:

JBPM 7.17 学习笔记(2)workbench

点击保存。

_in 后缀表示输入变量,_out 后缀表示输出变量。显然,输入变量主要用于读取全局变量的值,输出变量主要用于向全局变量写入值。
其中 ActorId 变量比较特殊,它表示这个任务将分配给 applicant 变量所表示的用户(也就是设置任务的 assignee)。通过这种方式,我们实现了任务的动态分配。

2.Leader审批节点。

JBPM 7.17 学习笔记(2)workbench

3.Director审批节点。

JBPM 7.17 学习笔记(2)workbench

4.HR备案节点

JBPM 7.17 学习笔记(2)workbench

编译&发布

Menu -> Projects,进入 get-started
的项目页面,点击 Build、Deploy,进行编译和发布。如果出现冲突,选择覆盖

新建流程实例

Menu -> Manage -> 新建过程实例 。如果流程定义有多个版本,请选择最新版本。
新建成功后,可以看到列表中多出了一个活动的流程实例:

JBPM 7.17 学习笔记(2)workbench

点击流程实例,可以查看到流程实例细节、过程变量、流程图等:
JBPM 7.17 学习笔记(2)workbench
JBPM 7.17 学习笔记(2)workbench
JBPM 7.17 学习笔记(2)workbench

查看待办

流程实例启动之后,就可以查看待办了。由于开始节点是自动办结的,流程一启动就会自动完成开始节点,因此此时流程已经流转到第二个节点,即提交申请环节,从上面的流程实例细节也可以看到,当前实例的活动用户任务已经不再是Start任务了,而是提交申请。而这个任务是分配给zhangsan1这个用户的,因此我们需要登录zhangsan1这个账号才能查看到这个任务。

退出 admin,登录zhangsan1用户。然后点击Menu -> Track -> Task Inbox,查看待办。

JBPM 7.17 学习笔记(2)workbench

点击该任务,可以对该任务进行操作:

JBPM 7.17 学习笔记(2)workbench

这里的 Inputs 和 Outputs 就是我们绘制流程图时设置的任务变量。Workbench 根据输入变量和输出变量自动生成了这个表单。输入变量是只读的,它们只是全局变量赋值过来的,你不能填写,输出变量可以由用户填写——但目前你还不能编辑它们,因为你需要首先启动(或者认领)任务。

点击启动,认领这个任务。同样是之前的那个表单,不同的是现在你可以编辑输出变量了。勾上 ApplicantSubmit_out,点击完成:

JBPM 7.17 学习笔记(2)workbench

注意,这里有一处错误,对于这个任务而言,输出变量其实只要 ApplicantSubmit_out 一个就够了,其余 3 个都是不必要的,你可以将它们删除。

这样 zhangsan1 就完成了这个任务。接下来的任务应该是Leader审批环节。

任务报告

点击 Menu -> Track -> Task Reports,查看任务报告:

JBPM 7.17 学习笔记(2)workbench

可以看到当前所有流程实例(目前只有 1 个)统计出来的任务总数是 2,其中已完成的是 1 个(即提交申请),待办的是 1 个(即Leader审批)。此外还有以各种方式的统计图表。

分别以 lisi1wangwuzhaoliu进行登录,完成整个流程,同时查看任务报告中各统计数据的变化。

流程报告

完成流程之后,可以用 Menu -> Track -> Process Reports 查看流程报告,可以查看流程实例的统计数据:

JBPM 7.17 学习笔记(2)workbench

测试分支

启动新的流程实例,分别测试其它分支的情况,比如请假天数 < 3 天,leader 驳回和 director 驳回的情况,看流程的流向是否正确。

表单设计器

workbench 设计的流程表单是千篇一律的,并没根据任务的情况做出不同的设计,比如前面提到的,Outputs 中的表单是把所有的输出变量都列出来了,不管这个任务有没有用到。

因此,我们需要手动设计每个任务的表单。

任务表单

Menu -> Projects,进入项目管理页面,可以看到除了我们绘制的流程图以外, workbench 还自动为我们生成了一个表单(最下面的 Task-taskform):

JBPM 7.17 学习笔记(2)workbench

点击它,进入表单设计器,点击重命名,输入提交申请-taskform然后点 rename。

重命名后别忘记点击保存按钮,否则不会生成新的表单。

返回 assets 列表,你会看到提交申请-taskform

JBPM 7.17 学习笔记(2)workbench

点击提交申请-taskform,进入表单设计器,将 Outputs 中除了第一项之外的变量删除:

JBPM 7.17 学习笔记(2)workbench

然后点击编辑,将 Label 改为提交:

JBPM 7.17 学习笔记(2)workbench

任务表单的命名规则是 {任务名称}-taskform,比如 提交申请-taskform,表示这个表单是在执行到用户任务提交申请时使用的表单。

同样的方式,我们分别创建出Leader审批Director表单HR备案表单。

JBPM 7.17 学习笔记(2)workbench

流程表单

流程表单就是流程启动时显示给用户的表单。目前我们使用的是表单引擎默认生成的表单:

JBPM 7.17 学习笔记(2)workbench

可以看到默认的流程表单会把所有的全局变量都罗列出来,这是没有必要的。我们需要重新设计流程表单。

进入流程图设计器,点击 Generate process form:

JBPM 7.17 学习笔记(2)workbench

这会在 assets 列表中多出一项get-started.test-taskform

JBPM 7.17 学习笔记(2)workbench

流程表单的命名规范是{流程ID-taskform},比如我们的流程 ID 是get-started.test,所以表单名称就是get-started.test-taskform

因为流程表单是在流程启动时显示的,而流程启动一般系统进行的,不是用户任务,不需要用户输入,因此将流程表单中的所有输出参数删除:

JBPM 7.17 学习笔记(2)workbench

进行测试

Build & Deploy 流程定义,开启新实例,测试流程。可以发现修改后的流程表单:

JBPM 7.17 学习笔记(2)workbench

填写表单,提交。

不要依赖表单中的 placeholder,placeholder 仅仅是一个提示信息,不表示为实例变量提供了默认值。
如果你某些字段没有填写,将导致流程实例无法流转。比如这里的申请人没有填写,那么下一个任务提交申请将无法生成。
你可以查看流程实例的过程变量来确认是否某些全局变量没有赋值。