流程实例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 class="com.luo.handler.CheckNumHandler"/>
<transition name="big" 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
分享到:
相关推荐
jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载 jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载
jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip
jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,共两卷
jbpm-eclipse插件,这个插件随jbpm4.4 一起发布,位于 jbpm-4.4/install/src/gpd 目录下,由于许多人找不到这个包,所有传上来,赚点积分。
通过查看JBPM的表,我们知道要实现流程监控功能就是把JBPM当中的JBPM_PROCESSDEFINITION(已发布的流程表),JBPM_PROCESSINSTANCE(流程实例表),JBPM_TASKINSTANCE(流程产生的任务实例表)这三张表串联起来就可以...
jbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3....
jbpm-jpdl-suite-3.2.GA.zip
jbpm-flow-builder-5.1.0.Final.jar jbpm5
jbpm-jpdl-suite-3.2.GA.zip
jbpm-jpdl-designer资源
jbpm-jpdl-suite-3.2.GA.zip
这个是jbpm-jpdl-3.2.3.zip的server部分,有60多兆, 只要将"jbpm-jpdl-3.2.3(没有server部分).rar"和这个合在一起就是整个的jbpm-jpdl-3.2.3.zip "jbpm-jpdl-3.2.3(没有server部分).rar"在我的另外一个上传资源里面
jbpm-starters-kit-3.1.2.zip官方下载地址 版本里包括一个JBPM流程设计器的Eclipse插件,和一个用JBOSS作为服务器的示例流程等相关文件。解压jbpm-starters-kit-3.1.2.rar到某个特定目录,这里我们首先用到的是包里...
jbpm-jpdl-designer-3.1.3.zip
jbpm-jpdl-suite-3.2.3安装配置.doc
jbpm-jpdl-3.2.3.zip 开源工作流引擎
详细介绍了如何在MyEclipse 8.5以上版本中安装jbpm-gpd-site.zip的步骤,还介绍了如何配置jpdl.xml文件标签的提示功能。
JBPM-----PPT 工作流JBPM完整PPT文件。帮你更快速上手。