jBPM资料总结
基本词汇 :
ProcessEngine :流程引擎
RepositoryService :流程资源,
ExecutionService:执行服务
TaskService: 任务服务
HistoryService:历史服务
ManagementService:管理服务
Start:启动节点
State:状态节点
Decision:决策节点
End:结束节点
Task:任务节点
Assignee:用来指派用户
Custom:自定义节点
Fork:分支节点
Events:事件
Assignment是任务和泳道通用的借口。
Assignment_handler是task节点的子节点。它的子节点都来自用户代码。
用户代码配置:
属性:
属性 | 类型 | 默认值 | 是否必填 | 描述 |
Class | 类全名 | 无 | {class|expr}必填其一 | 全类名,初始化只会进行一次,用户对象会被作为流程定义的一部分进行 |
Expr | 表达式 | 无 | {class|expr}必填其一 | 表达式的值会当做目标对象被获得,表达式会再每次使用时被执行,换句话说,执行的结果值不会按缓存 |
元素
元素 | 数目 | 描述 |
Field | 0~* | 描述一个配置值,在用户类使用之前注入到成员变量中 |
Property | 0~* | 描述一个配置值,在用户使用之前通过一个setter方法进行注入 |
Filed和property的属性
属性 | 类型 | 默认值 | 是否必填 | 描述 |
Name | String | 无 | 必填 | Field或property的名称 |
Filed和property包含的元素
Field和property元素都拥有一个子元素,表示将被注入的值
元素 | 数目 | 描述 |
String | 0~1 | Java.lang.String |
Int | 0~1 | Java.lang.Integer |
Long | 0~1 | Java.lang.Long |
Float | 0~1 | Java.lang.Float |
Double | 0~1 | Java.lang.Double |
True | 0~1 | Boolean.TRUE |
False | 0~1 | Boolean.FALSE |
Object | 0~1 | 会通过反射初始化对象 |
基本类型的属性
属性 | 类型 | 默认值 | 是否必填 | 描述 |
Value | Text | 无 | 必填 | Text值会被解析成期望的类型 |
On的属性
属性 | 类型 | 默认值 | 是否必填 | 描述 |
Event | {start|end|take|自定义值} | 无 | 必填 | 事件名称 |
On的子节点
元素 | 数目 | 描述 |
Event-listener | 0~* | 一个事件监听器实现对象 |
任何自由活动 | 0~* |
|
事件监听器的属性
Event-listener 属于用户代码,所以可以像用户代码一样进行配置。
任何自由活动(包括event-listener)在事件中,可以指定下面的额外属性
属性 | 类型 | 默认值 | 是否必填 | 描述 |
Propagation | {enable|disabled|true|false|on|off} | Disabled | 可选 | 指定事件监听器也被传播的事件调用 |
Continue | {sync|async|exclusive} | Sync | 可选 | 指定execution是否在事件监听器执行之前被异部执行 |
任务属性:
属性 | 类型 | 默认值 | 是否必填 | 描述 |
Swimlane | 泳道(字符串) | 无 | 可选 | 引用一个定义在流程中的泳道 |
泳道属性:
属性 | 类型 | 默认值 | 是否必填 | 描述 |
Name | 泳道(字符串) | 无 | 必填 | 泳道名称,这个名称将被任务泳道属性中引用 |
Assignee | 表达式 | 无 | 可选 | 用户id引用的用户负责完成这个任务 |
Candidate-groups | 表达式 | 无 | 可选 | 一个使用逗号分隔的组id列表。。所有组中的人将作为这个任务的这个泳道的候选人 |
Candidate-users | 表达式 | 无 | 可选 | 一个使用逗号分隔的用户id列表。所有的用户将作为这个任务的这个泳道中的候选人 |
Sub-process子流程
创建一个子流程实例然后等待直到它完成。当子流程实例完成,子流程中的流向就会继续
子流程属性
属性 | 类型 | 默认值 | 是否必填 | 描述 |
Sub-process-id | 字符串 | 无 | 这个或sub-process-key是必填的 | 根据id获得子流程。这意味着引用了一个流程定义的指定版本 |
Sub-process-key | 字符串 | 无 | 这个或sub-process-id是必填的 | 根据key获得子流程。这意味着引用了一个指定key的流程定义的最新版本。流程定义的最新版本会在每次活动执行的时候进行查找 |
Outcome | 表达式 | 无 | 当指定outcome-value时必填 | 当子流程结束的时候执行表达式。值用来映射向外的流向。添加outcome-value元素到sub-process活动的外出流向中 |
Sub-process元素
元素 | 多重 | 描述 |
Parameter-in | 0..* | 声明一个变量,传递给子流程实例,在创建它时。 |
Parameter-out | 0..* | 在子流程结束时设置到上级执行中 |
Parameter-in属性
属性 | 类型 | 默认值 | 是否必填 | 描述 |
Subvar | 字符串 | 无 | 必填 | 已经赋值的子流程变量的名称 |
Var | 字符串 | 无 | Var或expr其中之一必须指定值 | 上级流程环境中的变量名。 |
Expr | 字符串 | 无 | Var或expr其中之一必须指定值 | 这个表达式将会在super流程环境中被设置到子流程变量中。 |
Lang | 字符串 | Juel | 可选 | 表达式解析时使用的脚本语言 |
Parameter-out属性
属性 | 类型 | 默认值 | 是否必填 | 描述 |
Subvar | 字符串 | 无 | 必填 | 上级流程环境中需要设置的变量名 |
Var | 字符串 | 无 | Subvar或expr其中之一必须指定值 | 子流程中需要获取的变量名 |
Expr | 字符串 | 无 | Subvar或expr其中之一必须指定值 | 这个表达式将会在sub流程环境下被解析。结果值会被设置到上级流程变量中。 |
Lang | 字符串 | Juel | 可选 | 表达式解析时使用的脚本语言 |
Join属性
属性 | 类型 | 默认值 | 是否必须 | 描述 |
Multiplicity | Integer | 传入转移的数目 | 可选 | 在这个join活动之前 |
Locakmode | (none,read, Upgrade_nowait,write) | Upgrade | Optional | Hibernate的锁定模式,应用在上级执行,来防止两个还没到达join的同步事物看到对方,这会导致死锁 |
End execution结束流向
属性 | 类型 | 默认值 | 是否必须 | 描述 |
Ends | {processinstance|execution} | Processinstance | Optional可选 | 流向路径到达end活动整个流程实例处理就会结束 |
End multiple多个结束
流程发布执行过程
步骤一:加载jpdl配置文件,创建流程引擎实例,
具体实现代码:
ProcessEngine processEngine=new Configuration().buildProcessEngine();
Or
ProcessEngine processEngine=new Conifguation().setResource(“my-own-configuation-file.xml”).buildProcessEngine();
步骤二:发布流程实例使用RepostitoryService创建depolyment对象并进行流程实例发布
processService.createDeployment().addResource(“order.jpdl.xml”).deploy();
此种方式XML流程定义文件的来源可以是一个文件,url网址,字符串,inputStream,zip或jar压缩包和一个目录。
如果没有提供key,会在名字的基础自动生成,生成的key会替换所有不是字母和数字的字符。同一个名字关联一个key.
如果没有为流程文件提供版本号,jBPM会自动为它分配一个版本号。请特别注意哪些已经部署了的名字相同的流程文件的版本号。它会比已经部署的同一个key的流程定义里的最大的版本号还大,没有部署相同key的流程定义的版本号会分配为1
<process name=”Insurance claim”> ……. </process>
假设这个流程是第一次部署,下面就是他的属性;
Property | Value | Source |
Name | Insurance claim | Process xml |
Key | Insurance_claim | Generated |
Version | 1 | Generated |
Id | Insurance_claim:1 | generated |
<process name=”Insurance claim” key=”ICL”> …….. </process>
有key值属性的流程
Property | Value | Source |
Name | Insurance claim | Process xml |
Key | ICL | Process xml |
Version | 1 | Generated |
Id | ICL:1 | Generated |
步骤三:启动流程实例ExecutionService
具体实现代码
executionService.startProcessInstanceById(“ICL”);
说明:上述代码会查找key为ICL的最新版本的流程定义,然后在流程定义里启动流程实例。
当insurance claim流程部署了一个新版本,startProcessInstanceBykey方法会自动选择新部署的版本。
明确流程版本:
executionService.startProcessInstanceById(“ICL:1”);
换句话说,你如果想明确的版本启动流程实例,是可以使用流程定义的id启动流程实例。如上所述。
欢迎大家加入Q群进行交流138153063