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