jBPM4的学习流程
1>jBPM4通过org.jbpm.pvm.internal.ant.JbpmDeployTask通过读取jbpm.cfg.xml中的JDBC数据连接信息
2>对jbpm4的数据库表简单介绍
3>通过ProcessEngine类的贯穿来获取服务接口(Service API)来认识所有的常用类
4>对流程定义语言中活动几个常用的介绍
5>事件的介绍
JBPM:部署流程定义
jBPM4通过org.jbpm.pvm.internal.ant.JbpmDeployTask通过读取jbpm.cfg.xml中的JDBC数据连接信息直接将业务流程部署到数据库中。
它不仅可以部署单个业务流程,也可以部署一组业务流程归档到服务器上。
jbpm首先扫描业务流程归档中所有以.jpdl.xml结尾的文件,并解析,然后用来发起流程实例,业务流程归档中所有其他资源也会在部署
过程中被持久化到数据库中。所有这些资源被统一编号保存在数据库表jbpm4_lob中 我们可以通过jbpm4提供的
RepositoryService.getResourceAsStream API随时访问这些资源。
jbpm4的数据库表简单介绍
JBPM4_DEPLOYMENT 流程定义表
JBPM4_DEPLOYPROP 流程定义属性表
JBPM4_EXECUTION 流程实例表
JBPM4_HIST_ACTINST 流程活动(节点)实例表
JBPM4_HIST_DETAIL 流程历史详细表
JBPM4_HIST_PROCINST 流程实例历史表
JBPM4_HIST_TASK 流程任务实例历史表
JBPM4_HIST_VAR 流程变量(上下文)历史表
JBPM4_ID_GROUP 角色表
JBPM4_ID_MEMBERSHIP 用户角色表
JBPM4_ID_USER 用户表
JBPM4_JOB 定时表
JBPM4_LOB 存储表
JBPM4_PARTICIPATION 参与者表
JBPM4_SWIMLANE 泳道表
JBPM4_TASK 任务表
JBPM4_VARIABLE 上下文表
(1)JBPM4_DEPLOYMENT、(2)JBPM4_DEPLOYPROP及(3)JBPM4_LOB:
存储 上传一个包含png和jpdl.xml的zip包 的相关数据
jbpm4_deployment表多了一条记录
jbpm4_deployprop表多了四条记录,对应langid,pdid,pdkey,pdversion
jbpm4_lob 表多了二条记录,保存流程图png图片和jpdl.xml
(4)JBPM4_HIST_PROCINST与(5)JBPM4_HIST_ACTINST
分别存放的是Process Instance、Activity Instance的历史记录。
(6)JBPM4_EXECUTION
主要是存放JBPM4的执行信息,Execution机制代替了JBPM3的Token机制
(7)JBPM4_TASK
存放需要人来完成的Activities,需要人来参与完成的Activity被称为Task。
(8)JBPM4_PARTICIPATION
存放Participation的信息,Participation的种类有Candidate、 Client、Owner、Replaced Assignee和Viewer。而具体的
Participation既可以是单一用户,也可以是用户组。
(9)JBPM4_SWIMLANE
Swim Lane是一种Runtime Process Role。通过Swim Lane,多个Task可以一次分配到同一Actor身上。
(10)JBPM4_VARIABLE
存的是进行时的临时变量。
(11)JBPM4_HIST_DETAIL
保存Variable的变更记录。
(12)JBPM4_HIST_VAR
保存历史的变量。
(13)JBPM4_HIST_TASK
Task的历史信息。
(14)JBPM4_ID_GROUP(15)JBPM_ID_MEMBERSHIP(16)JBPM4_ID_USER
这三张表很常见了,基本的权限控制,关于用户认证方面建议还是自己开发一套,JBPM4的功能太简单了,使用中有很多需要难以满足。
(17)JBPM4_JOB
存放的是Timer的定义。
(18)JBPM4_PROPERTY
流程定义、流程实例和执行(executions)的概念
流程定义:是对业务过程步骤的描述,在jbpm4中它表现为若干个“活动”节点,通过“转移”线条串联
流程实例:是表示流程定义在运行时特有的执行例程
执行:一个实例在其生命周期中,最典型的特征就是具有指向当前执行活动的指针“执行”它在jbmp3中被称为“token”在jbpm4中被称
为“executions”
常用类:
ProcessEngine:所有的服务接口都是通过ProcessEngine对象获得的。
1》ProcessEngine通过Configuration类构建,Configuration以单例模式获取ProcessEngine对象。
2》ProcessEngine是线程安全的,所有的线程和请求都可以使用同一个ProcessEngine对象。
ProcessEngine对象的实现方式:
1)方式一:使用classpath根目录下的默认配置文件jbpm.cfg.xml创建一个单例的ProcessEngine。
ProcessEngine processEngine = Configuration.getProcessEngine();
2)方式二:指定其他位置的jBPM配置文件,如src根目录config包下的my-jbpm-cfg.xml。
ProcessEngine processEngine = new Configuration().setResource("config/my-jbpm-cfg.xml").buildProcessEngine();
2.通过ProcessEngine 对象获取各种服务接口
1)获取RepositoryService接口。
RepositoryService repositoryService = processEngine.getRepositoryService();
RepositoryService----流程资源服务接口。提供对流程定义的部署、查询、删除和流程图查看等操作。
2)获取ExecutionService接口。
ExecutionService executionService = processEngine.getExecutionService();
ExecutionService----流程执行服务接口。提供启动流程实例、推进、删除等操作。
3)获取TaskService接口。
TaskService taskService = processEngine.getTaskService();
TaskService----人工任务服务接口。提供对任务的创建、提交、查询、保存、删除等操作。
4)获取HistoryService接口。
HistoryService historyService = processEngine.getHistoryService();
HistoryService----流程历史服务接口。提供对任务的管理操作。提供对流程历史库中历史流程实例、历史活动实例等记录的查询。
5)获取ManagementService接口。
ManagementService managementService = processEngine.getManagementService();
ManagementService----流程管理控制服务接口。
6)获取IdentityService接口。
IdentityService identityService = processEngine.getIdentityService();
IdentityService----身份认证服务接口。提供对流程用户、用户组管理。
ProcessInstance类 --流程实例类
获得流程实例:
ProcessInstance processInstance = executionService.findProcessInstanceById(id);
String processDefinitionId = processInstance.getProcessDefinitionId();
获得流程定义:
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId
(processDefinitionId).uniqueResult();
ActivityCoordinates 类:流程图活动点坐标
ActivityCoordinates ac = repositoryService.getActivityCoordinates(processInstance.getProcessDefinitionId(),
activityNames.iterator().next());
jBPM流程语言的定义:
jPDL(jBPM Process Define Language,jBPM流程定义语言)
<process></process>(流程)元素是每个流程的顶级元素。
start --- 开始活动
state --- 状态活动
decision --- 判断活动
fork-join --- 分支/聚合活动
end --- 结束活动
task --- 人工任务活动
sub-process --- 子流程活动
custom --- 自定义活动
start(开始活动)
即流程的入口,在一个流程的定义里必须有且只有一个start活动,start活动必须有一个流出转移(transition),这个转移会在同过
start活动的时候开始执行。
<start g="201,14,48,48" name="开始">
<transition g="-42,-10" name="请假" to="填写请假单"/>
</start>
流程通过start标签开始,通过transition流出转移,通过to属性指定下一个活动节点。
state(状态活动)当需要流程受到某些特定的外部干预后在继续运行,而这之前流程“陷入”一个中断“等待”状态,您需要的就是state
活动,当流程运行到state活动时,会自动陷入等待状态(waiting state),也就是说流程引擎在收到外部触发信号之前会一直使流程实例
在此state活动等待,从某方面来说,task活动可以说是一种特殊化的state活动,同任务结点不同的是,状态结点不会向任务列表添加任
务实例,在进入该结点时,通过node-enter事件向外部系统发送一个消息,然后结点进入等待状态;当外部系统完成处理,并回送一个消
息,这将导致触发一个signal()方法的运行,该方法重新激活正在等待的流程继续下行jBPM中使用ExecutionService来控制对state的
sign操作。
decision(判断活动)
decision活动可以拥有多个流出转移,当流程实例到达decision活动时,会根据“最先匹配成功的一个条件”自动通过相应的流出转移。
decision活动的condition元素
decision活动中会运行并判断其每一个transition元素里的流转条件--流转条件由condition元素表示,当遇到一个transititon的
condition值为true或者一个没有设置condition的transition,那么流程就立刻会流向这个transition。
或者利用decision的expr表达式来判断流向哪个transition,
使用decision活动的handler元素
也许对于复杂的业务逻辑或大量的计算,以上流转不够方便,您可以自己实现判断处理接口,即通过decision handler的方式,将给您带
来无限的自由空间。
1>必须实现DecisionHandler接口将流转判断的决定权委派给这个实现类。
String decide(OpenExecution execution)必须实现的方法
//这个接口就这一个方法,提供流程实例的执行上下文(execution)作为参数,需要返回字符串型的转移名称
需要在此decision标签中:加入
<handler class="org.jbpm.examples.decision.handler.ContentEvaluation"> //所有的流转判断逻辑都委派给了这个
ContentEvaluation handler统一处理
decision 和 state的区别:
如果decision活动定义的流转条件没有任何一个得到满足,那么流程实例将无法进行下去,会抛出异常。
如果state活动有多个流出转移,且同样没有任何得到一个满足,那么流程实例将流向state活动定义的第一条流出转移,从而进行下去。
结论:
decision 活动具有更加严格的条件判断特性,如果不定义默认路径,则无条件满足,即报错。
end(结束活动)
默认情况下,当流程实例运行到end活动结束,但是在到达end活动的实例中,仍然活跃的流程活动(这可能是fork-join并发流转引起的)
将会被保留继续执行。
还有 end-cancel 和 end-error活动
fork-join(分支/聚合活动)
当我们需要流程并发(currentcy)执行的时候,就需要使用到fork-join活动的组合。fork活动可以使流程在一条主干上出现并行分支,
join活动则可以使流程的并行分支聚合成一条主干。
fork活动仅具有jBPM活动的最基本特征,即具有1个name属性和n个流出转移元素。
task(人工任务活动)
在jBPM中,task活动一般用来处理涉及人机交互的活动。task活动的功能在jBPM中乃至整个工作流的应用中都具有极其重要的意义。因为
处理人工任务、电子表单是工作流应用中最“繁琐”和细致的工作。
1》关于任务的分配者
我们可以使用task活动的assignee属性(分配者属性)简单地将一个任务分配给指定的用户。
assignee 类型 表达式 描述 被分配到任务的用户ID,即负责完成任务的人
例如:<task assignee="#{manager}" form="/pages/Leave/manager.do" g="103,252,92,52" name="经理审核">
通过TaskService可以找到这个人下的所有任务
List<Task> taskList = taskService.findPersonalTasks(user);
2》关于任务的候选者
jBPM支持将任务分配给一组候选用户,组中的一个用户可以接受整个任务并完成之,这就是任务的候选机制:
candidate-groups 类型 表达式 --- 描述使用逗号分隔的用户组ID列表,所有组的用户将会成为任务的候选者。
candidate-users 类型 表达式 --- 描述使用逗号分隔的用户ID列表,所有列表中的用户将会成为任务的候选者。
可以通过 Service API taskService.findGroupTasks来获取.
IdentityService(身份认证服务)
可以通过IdentityService.createGroup("sales-dept");来创建sale-dept组
通过IdentityService.createUser("","","")来创建用户
通过taskService.takeTask(task.getId(),"xx");
事件:
事件这种设计使得我们很方便在流程、活动、任务生命周期的各个阶段横行的插入定制的代码逻辑。
这种基于事件-监听的设计模式具有一定的AOP(面向切面编程)思想。
事件(event)用来定位在流程执行过程中特定的“点”,例如“流程实例开始”、“状态活动结束”等,可以在这些“点”注册一些列的
监听器(listener)当流程的执行通过这些被监听的点时,监听器中设定的逻辑就会被执行了。
事件监听器:需要实现EventListener接口。
void notify(EventListenerExecution execution) throws Exception;
//接口方法提供了流程执行对象execution,这里足够拿得到当前流程的任何信息
如果不想自己实现EventListener接口
为了给程序分配一系列的事件监听器。可以使用on元素来为事件监听器分组并指定事件,on元素可以嵌套到process元素或process元素下
的任何流程活动中。
on元素的event 属性目前只支持"start- 开始事件" 和"end- 结束事件"的监听
对于转移事件,只需要在transition元素嵌入相应的事件监听器即可。
on元素支持的子元素event-listener 描述 指定自定义的事件监听器,实现EventListener接口
例如:
<process name="EventListener" xmlns="http://jbpm.org/4.4/jpdl">
<on event="start">
<event-listener class="org.jbpm.examples.eventlistener.LogListener">
<field name="msg"><string value="start on process definition"/></field>
</event-listener>
</on>
<start g="17,19,48,48">
<transition to="wait"/>
</start>
<state name="wait" g="96,16,104,52">
<on event="start">
<event-listener class="org.jbpm.examples.eventlistener.LogListener">
<field name="msg"><string value="start on activity wait"/></field>
</event-listener>
</on>
<on event="end">
<event-listener class="org.jbpm.examples.eventlistener.LogListener">
<field name="msg"><string value="end on activity wait"/></field>
</event-listener>
</on>
<transition to="park">
<event-listener class="org.jbpm.examples.eventlistener.LogListener">
<field name="msg"><string value="take transition"/></field>
</event-listener>
</transition>
</state>
<state name="park" g="231,19,80,52"/>
</process>
浙公网安备 33010602011771号