首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

jbpm开发方法-流程实例

2012-11-14 
jbpm开发步骤-流程实例流程实例processInstance:??private ProcessEngine engineprivate RepositoryServi

jbpm开发步骤-流程实例

流程实例processInstance:

?

?

private ProcessEngine engine;private RepositoryService repositoryService;private ExecutionService executionService;private String deploymentId; public ProcessInstanceTest() {engine = Configuration.getProcessEngine();repositoryService = engine.getRepositoryService();executionService = engine.getExecutionService();}/** * 测试流程实例 */public void testProcessInstance(){deploymentId = repositoryService.createDeployment().addResourceFromClasspath("hello.jpdl.xml").deploy();List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();ProcessInstance processInstance = executionService.startProcessInstanceByKey("hello");System.out.println(processInstance);}

?

?

流程实例的操作都是executtionService来执行的,比如开始一个调用的是startProcessInstanceByKey("hello");

?

由于我们jpdl文件中的是state节点,所以当我们start一个Instance后,它流转到了state节点,此时流程实例处于等待状态,我们可以用

?

processInstance.isEnded()

?来判断,否则就要手动触发向下流转:

?

processInstance = executionService.signalExecutionById(processInstance.getId());

此时才isEnded才为true,除非直接结束他:

?

executionService.endProcessInstance(processInstance.getId(), "删除需要理由吗?");

?或者直接删除一个流程实例:

?

executionService.deleteProcessInstanceCascade(processInstance.getId());

??同样查询流程实例列表用:

?

List<ProcessInstance> list2 = executionService.createProcessInstanceQuery().list();
?

?

?

?

?

二、活动介绍

1、控制流程的活动(让活动在不同节点状态不一样)

?

start?state??end Decision fork join sub-process task

?

start开始节点,一个jpdl文件里至少应该有个start节点。start里必须有transition,当我们调用

startProcessInstanceByKey("leave")就会触发他流向到transition指定的节点

?

state状态节点,当流程实例运行到state节点时不会自动向下执行,除非有外部的触发signalExecution(executionId,"to 经理")。

?

?

我们可以在state节点里加一个 监听器,用来判断signal作用在正确的流程实例上

?

?

<state name="经理审批"><on event="start" ><event-listener="com.luo.listener.StartEventListener"/></on></state>
?

?

?

在StartEventListener我们可以execution.getId(),并且也能为signal提供一个ID向下执行

?

decision 决定节点,里面有若干个transition,他会根据条件判断然后自动向下执行,他有3种设置方式

方法一:

?

<decision name="checkNum"><transition name="big" to="tobig"><condition expr="#{num > 10}"/></transition><transition name="small" to="toSmall"><condition expr="#{num < 10}"/></transition></decision>

?

?方法二:首先在jpdl中

?

?

?

<decision name="checkNum" expr="#{content}">     <transition name="big" to="toBig"/>     <transition name="small" to="small"/></decision>

?

然后在java代码中执行

?

String<String,Object> variables = new HashMap<String,Object>;variables.put("content",big);executionService.startProcessInstanceByKey("leave",variables);

?

?

方法三:加一个handler,即实现DecisionHandler接口,重写里面的decide(OpenExecution execution)方法

?

<decision name="checkNum" expr="#{content}"><handler to="toBig"/>     <transition name="small" to="small"/></decision>

?然后在java中

?

?

public class CheckNumHandler implements DecisionHandler{     public String decide(OpenExecution execution){              String content = (String)execution.getVariables("content");               if(content.equals("big")){                       return "big";                }                if(content.equals("small")){                       return "small";                }      }}

?

fork和join通常一起用:表示分开和合并

?

end 结束节点:

只有当流向到end节点时,才会结束流程实例,其他的并发的流向会放弃任务

可以有多个end,表示不同的结束方式。

?

流向(Executtion)会以不同状态结束,结束的结果可以通过下列方式展示

end 上加一个state属性<end name="ok" state="顺利完成"/>

或者直接用end-cancel或者end-error表示<end-cancel name="cancel"/>

?

?

task任务活动:一个任务可以分配给一个用户,或者一个用户组

类型一:

?

<task name="review" assignee="#{order.owner}"><transition to="to big"/></task>

?

?assignee属性默认会当作表达式来执行,当然之前会在java中写:

?

Map variables = new HashMap();variables.put("order",new Order("张三"));//order是我自己的类executionService.signalExecutionById(psId,variables);

?

?这样这个task只会被分配给张三了,张三在使用

?

taskService.findPersonalTasks("张三");
taskService.getAssignedTasks("张三");

?

?就能获得任务列表了

?

类型二:用户组就涉及到了候选人的问题

?

<task name="review" candidate-groups="sales-dept"/><transition to="to big"/></task>

?

?当然之前我们会在java代码中:

identityService.createGroup("sales-dept");identityService.createUser("张三");identityservice.createMembership("张三","sales-dept");identityService.createUser("李四");identityservice.createMembership("李四","sales-dept");

?这样在流程创建后,任务会出现在 张三 李四的分组任务列表中

taskService.findGroupTasks("张三");
?

候选人必须要有人在处理任务之前接受任务,分组任务列表中,用户接口必须只接受“对这些任务接受” 的操作

这样当某个用户接受了后,这个任务的分配人就是当前用户,而这个任务会从“所有分组候选人”的任务列表上消失,他会出现在 用户的已分配任务列表中。

?

任务分配处理器AssigmentHandler可以编程式的来计算一个任务的分配人和候选人

public interface AssigmentHandler extends Serializable{void assign(Assignable assignable,OpenExecution execution);}

?Assignable是任务和泳道的通用接口。。。。。。。。。。。

assignment-handler是task的子元素,用来指定用户对象

<task name="review"><assignment-handler class="com.luo.handler.UserAssignHandler"><field name="assignee"><String value="张三"/></field></assignment-handler></task>
?

?

通常用processInstance.findActiveExecutionIn("state name or desition name or ..")来判断name节点是否是当前节点

?

?

?

?

decision

?

?

2、原子活动(让活动在该节点做一些事)

?

java script sql hql emai

?

?

?

?

热点排行