jbpm4工作流详解

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>

你可能感兴趣的:(jbpm4)