任务交付后为什么jbpm4工作流demo

6976人阅读
工作流(5)
工作流视频教程:链接:/s/1hs176BE 密码:klkg
ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图。
Execution,执行:一般情况下,一个流程实例是一个执行树的根节点。&
使用树状结构的原因在于,&这一概念只有一条执行路径,&使用起来更简单。业务不需要了解流程实例和执行之间功能的区别。因此,API里只有一个执行类型来引用流程实例和执行。
假设汇款和存档可以同时执行,那么主流程实例就包含了个用来跟踪状态的子节点:
总的来说:
ProcessInstance(流程实例)就是Execution(执行对象),processInstanceId就是executionId。
&在源码中,ProcessInstance接口直接继承了Execution接口。
package org.jbpm.
/** a process instance is one execution of a process definition.
* One process instance can have many concurrent executions.
* Executions are structured in a tree of which the ProcessInstance
* is the root.
* @author Tom Baeyens
public interface ProcessInstance extends Execution {
注释大概意思为:
一个流程实例是一个流程定义的执行。
一个流程实例可以有多个同时进行的执行对象。
执行对象构成了一棵树,而流程实例是这棵树的根结点。
1.启动流程实例
a)&普通方法
// 启动流程实例
// jbpm4_execution,正在执行的信息表
// jbpm4_hist_procinst,历史信息表
public void startProcessInstance() {
// 使用指定key的最新版本的流程定义启动流程实例,返回一个实例流程对象
ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey(&test&);
System.out.println(&id=& + pi.getId()//
+ &, state=& + pi.getState()//
+ &, processDefinitionId=& + pi.getProcessDefinitionId());
b)&启动流程实例,并设置一些流程变量
Map&String, Object& variables = new HashMap&String, Object&();
variables.put(&申请人&, &张三&);
variables.put(&报销金额&, 1000.00);
// 启动流程实例,并设置一些流程变量
ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey(processDefinitionKey, variables);
2.向后执行一步(Signal)
a)&向后执行一步,使用唯一的outcome离开活动
processEngine.getExecutionService().signalExecutionById(executionId);
b)&向后执行一步,使用唯一的outcome离开活动,并设置一些流程变量
// 准备流程变量
Map&String, Object& variables = new HashMap&String, Object&();
variables.put(&审批结果&, &同意&);
processEngine.getExecutionService().signalExecutionById(executionId, variables);
c)&向后执行一步,使用指定的outcome离开活动
String outcome= &to end1&;
processEngine.getExecutionService().signalExecutionById(executionId, outcome);
d)&向后执行一步,使用指定的离开活动,并设置一些流程变量
String outcome= &to end1&;
Map&String, Object& variables = new HashMap&String, Object&();
variables.put(&审批结果&, &同意&);
processEngine.getExecutionService().signalExecutionById(executionId, outcome, variables);
3.查询任务
a)&查询个人任务列表
// 查询我的未办理完的任务列表
// jbpm4_task,正在执行的信息表
// jbpm4_hist_task,历史信息表
public void findMyTaskList() {
String userId = &员工&;
//String userId = &部门经理&;
//String userId = &总经理&;
// 方式1.查询我所有未办理的任务的列表
// List&Task& list = processEngine.getTaskService().findPersonalTasks(userId);
// 方式2.分页的查询
List&Task& list = processEngine.getTaskService()//
.createTaskQuery()//
.assignee(userId)//
.page(0, 100)
System.out.println(&============== 【& + userId + &】的未办理的任务列表 =============&);
for (Task t : list) {
System.out.println(&id=& + t.getId()//
+ &, name=& + t.getName()// 任务的名称
+ &, assignee=& + t.getAssignee()// 任务的办理人
+ &, createTime=& + t.getCreateTime()// 任务的创建时间
+ &, executionId=& + t.getExecutionId()); // 所属的执行对象的id
b)&查询组任务列表
taskService.findGroupTasks(userId);
List&Task& list = processEngine.getTaskService()//
.createTaskQuery()//
.candidate(userId)//
4.办理任务
a)&正常完成任务
public void completeTask() {
String taskId = &180009&;
//普通的方法
processEngine.getTaskService().completeTask(taskId);
//指定下一步的方法
processEngine.getTaskService().completeTask(taskId, outcome);
//设置流程变量的方法
processEngine.getTaskService().completeTask(taskId, outcome, variables);
b)&自行控制完成任务后是否向后流转(少用)
String taskId = &120001&;
// 1,设置为false代表:办理完任务后不向后移动(默认为true)
TaskImpl taskImpl = (TaskImpl) processEngine.getTaskService().getTask(taskId);
taskImpl.setSignalling(false);
// 2,办理完任务
processEngine.getTaskService().completeTask(taskId);
5.拾取任务(少用)
a)&TaskService.takeTask(taskId,&userId),拾取组任务到个人任务列表中,如果任务有assignee,则会抛异常。
b)&processEngine.getTaskService().assignTask(taskId,&userId),转交任务给其他人,(如果任务有assignee,则执行这个方法代表重新分配。也可以把assignee设为null表示组任务没有人办理了)
6.设置与获取流程变量
a)&方式:根据&设置或获取流程变量
ExecutionService.setVariable(executionId, name, value);
Object obj = executionService.getVariable(executionId, &请假人&);
b)&方式:根据&设置或获取流程变量
TaskService.setVariables(taskId, variables); // 一次设置多个变量
Object obj = executionService.getVariable(executionId, &请假人&);
7.直接结束流程实例(手工)
String processInstanceId =
&test.10001&;
processEngine.getExecutionService().endProcessInstance(processInstanceId, ProcessInstance.STATE_ENDED);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:493472次
积分:4539
积分:4539
排名:第5180名
原创:94篇
转载:76篇
评论:105条
(6)(4)(1)(4)(2)(2)(1)(1)(8)(4)(1)(2)(6)(7)(2)(8)(5)(3)(6)(20)(18)(31)(8)(1)(1)(16)(2)&process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl"&
&start name="start1" g="243,29,48,48"&
&transition name="提交到任务A" to="任务A" g="-63,-11"/&
&end name="end1" g="243,393,48,48"/&
&task assignee="A" name="任务A" g="224,115,92,52"&
&transition name="提交到任务B" to="任务B" g="-77,-11"/&
&task assignee="B"
name="任务B" g="220,221,92,52"&
&transition name="提交到任务C" to="任务C" g="-83,-14"/&
&task assignee="C" name="任务C" g="224,308,92,52"&
&transition name="通过" to="end1" g="-62,-25"/&
&/task&&/process&
repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/task/task.jpdl.xml").deploy();创建流程实例
//流程部署KEY
ProcessInstance processInstance = executionService.startProcessInstanceByKey("task");
print("流程实例ID",processInstance.getId());
获取当前节点
//流程实例ID
String name = executionService.createProcessInstanceQuery().processInstanceId("task.290001").uniqueResult().findActiveActivityNames().toString();
print("当前节点名词:",name);
获得任务列表
List&Task& tasks = taskService.findPersonalTasks("A");
print("任务数量",tasks.size());
print("任务名词",tasks.get(0).getActivityName());
print("任务ID",tasks.get(0).getId());
pleteTask("290002");
阅读(...) 评论()主要是在任务节点处保存一个链接地址(表单),方便在执行到此时取值,访问。
好处是XML可随时修改,部署。
&?xml version="1.0" encoding="UTF-8"?&
&process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl"& &swimlane assignee="U1" name="mySwim"/&
&start g="243,29,48,48" name="start1"&
&transition g="-63,-11" name="提交到任务A" to="任务A"/&
&end g="242,333,48,48" name="end1"/&
&task form="localhost:8080/myApp/index.jsp" assignee="f1" g="224,115,92,52" name="任务A" &
&transition g="-65,-14" name="提交到任务B" to="任务B"/&
&task form="localhost:8080/myApp/indexB.jsp" assignee="f2" g="427,115,92,52" name="任务B"&
&transition g="-83,-14" name="提交到任务C" to="任务C"/&
&task g="222,207,92,52" name="任务C" &
&transition g="-62,-25" name="通过" to="end1"/&
&/task&&/process&
流程操作代码相同。
public void deploy() {
super.startUp();
repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/task/form/task4.jpdl.xml").deploy(); }
@Override public void createInstance() {
super.startUp();
ProcessInstance processInstance = executionService.startProcessInstanceByKey("task");
print("流程实例ID",processInstance.getId()); }
@Override public void getCurrectActivity() {
super.startUp();
String name = executionService.createProcessInstanceQuery().processInstanceId("task.500001").uniqueResult().findActiveActivityNames().toString();
print("当前节点名词:",name); }
@Override public void getTask() {
super.startUp();
List&Task& tasks = taskService.findPersonalTasks("f2");
print("任务数量",tasks.size());
print("任务名词",tasks.get(0).getActivityName());
print("任务ID",tasks.get(0).getId());
print("对应表单",tasks.get(0).getFormResourceName()); }
@Override public void completeTask() {
super.startUp();
pleteTask("500002"); }
阅读(...) 评论()任务变量与流程变量的操作相同,前者帮定任务ID,后者绑定流程ID。
添加任务变量
//创建流程引擎
ProcessEngine processEngine =
Configuration.getProcessEngine();
//获得任务服务
TaskService taskService = processEngine.getTaskService();
创建任务变量
Map&String,Object& map = new HashMap&String,Object&();
map.put("taskUserID", "100");
map.put("taskUserName", "jack");
//任务ID,变量集合
taskService.setVariables("50004", map);
获取单独任务变量
String taskUserID = taskService.getVariable("70001", "userId").toString();
String taskUserName = taskService.getVariable("70001", "userName").toString();
其余操作参考流程变量操作。
阅读(...) 评论()相关推荐:数据库配置文件:jbpm.hibernate.cfg.xml&hibernate-configuration& &session-factory&
&property name=&show_sql&&true&/property&
&property name=&hibernate.dialect&&org.hibernate.dialect.HSQLDialect&/property&
&property name
/** * 流程实例 **启动流程实例 **完成任务 **查询 **查询流程实例 **查询任务 **查询正在执行的任务 **查询所有的正在执行的任务 **根据任务的执行人查询正在执行的任务 **根据executionId查询正在执行的任务 **根据piid查询正在执行的任务 **根据pdid查询正在执行的任务 **根据taskid查询任务taskService.getTask(String taskId);和其他的查询不一样 **查询已经完成的任务 **查询所有的 **根据任务的执行人 **根据executionID **....... **结束流程实例 * @author Administrator * */public class PITest extends BaseJbpm{ /*** 涉及到的表**JBPM4_EXECUTION**表示当前正在执行的流程实例**字段*DBID_:主键*ID_:流程实例ID*ACTIVITYNAME_:当前流程实例活跃的节点*PROCDEFID_:流程定义ID**JBPM4_HIST_PROCINST**表示历史的流程实例,但是当前正在运行的流程实例也在这里**字段*DBID_:主键*ID_:流程实例ID*START_:整个流程实例的开始时间*END_:流程实例的结束时间,如果该流程实例为当前正在运行的流程则,该值为空*STATE:表示流程实例的状态如果是正在运行,为active如果流程实例结束为ended**JBPM4_TASK**表示当前正在执行的任务*说明:任务是jbpm流程图的一个节点**字段*DBID_:主键、任务ID*NAME_:任务名称*ASSIGNEE_:任务的执行人**JBPM4_HIST_TASK**表示历史的任务,但是当前正在执行的任务也在这里**字段*STATE_:如果一个任务被完成以后,值为completed*end_:任务的结束时间有值了**JBPM4_HIST_ACTINST**表示历史的节点**字段*TYPE_:节点类型*说明:**当启动流程实例的时候,会自动的离开开始节点,流向下一个节点**jbpm4_task为临时表,当当前的任务完成以后,该数据就被删除了*/ @Test public void testStartPIByPDID(){ProcessInstance pi= processEngine.getExecutionService().startProcessInstanceById(&qingjia1-1&);System.out.println(pi.getId());System.out.println(pi.getState());} /*** 根据pdkey启动流程实例,是该key下,最高版本*/ @Test public void testStartPIByPDKEY(){processEngine.getExecutionService().startProcessInstanceByKey(&qingjia1&); }/*** 完成任务*/ @Test public void testFinishTask(){processEngine.getTaskService().completeTask(&60002&); }/*** 查询所有的流程实例*/ @Test public void testQueryAllPI(){List&ProcessInstance& piList = processEngine.getExecutionService().createProcessInstanceQuery()///.processDefinitionId(&&)//可以根据pdid查询流程实例,很多个.list();for(Proces相关推荐:这段时间由于工作需要,一直学习、研究jbpm。起初一窍不通,走了不少弯路,重jbpm3看到了jbpm4,。虽说公司项目要求用jbpm4,刚开始先从jbpm3 看起,jbpm4 对jbpm3基本上是一种重构性升级,但通过对比着学习还是掌握了不少东西。近两天看了看jbpm的源码,虽看sInstance pi:piList){/*** 可以查询piid,pdid,state等*/System.err.println();System.err.print(&instanceID&+pi.getId());System.err.print(&\t\t\tinstanceKEY&+pi.getKey());System.err.print(&\t\t\tinstanceNAME&+pi.getName());System.err.println(&\t\t\tinstanceSTATE&+pi.getState());} }/*** 查询所有的正在执行的任务*/ @Test public void testQueryAllTask(){List&Task& taskList = processEngine.getTaskService().createTaskQuery()//.processDefinitionId(&&).list();for(Task task:taskList){System.out.println(&assignee:&+task.getAssignee());System.out.println(&name:&+task.getName());System.out.println(&createtime:&+task.getCreateTime());} }/*** 可以根据任务的执行人查询当前正在执行的任务* 可以根据pdid查询当前正在执行的任务*/ @Test public void testQueryTaskByPDID(){List&Task& taskList = processEngine.getTaskService().createTaskQuery().processDefinitionId(&qingjia1-4&).list();System.out.println(taskList.size()); }/*** Execution**如果不存在并发的情况,那么exection和process instance是一样的**如果存在并发的情况,execution代表分支,process instance代表主线**根据executionID查询任务,有唯一的一个*/@Test public void testQueryTaskByTaskID(){Task task = processEngine.getTaskService().getTask(&60002&);System.out.println(task.getName()); }/*** 查询已经完成的所有的任务*/ @Test public void testQueryAllHistTask(){List&HistoryTask& histTaskList = processEngine.getHistoryService().createHistoryTaskQuery()//.assignee(&&)可以根据任务的执行人查询已经完成的任务//.executionId(&&)可以根据executionID查询已经完成的任务.state(&completed&).list();for(HistoryTask histTask:histTaskList){System.out.println(histTask.getEndTime());System.out.println(histTask.getAssignee());} }/*** 直接结束流程实例*/ @Test public void testEndPI(){processEngine.getExecutionService().endProcessInstance(&qingjia1.20001&, &error&); }/*** 根据 piid查询流程实例,如果查询出来的结果为null,说明该流程实例已经结束了*/ @Test public void testIsEndPI(){ProcessInstance pi = processEngine.getExecutionService().createProcessInstanceQuery().processInstanceId(&qingjia1.60001&).uniqueResult();System.out.println(pi);//如果该值为null,说明该流程实例已经结束了 }} 文章出处:/Linux/858.htm
/**?* 流程实例?* ? ?* ?启动流程实例?* ? ?* ?完成任务?* ? ?* ?查询?* ? ? ?* ?查询流程实例?* ? ? ?* ?查询任务?* ? ? ? ? ?* ?查询正在执行的任务?* ? ? ? ? ? ?* ?查询所...
------分隔线----------------------------
相关阅读排行
相关最新文章
Copyright 2012- ( Coin163 ) All Rights Reserved &&}

我要回帖

更多关于 jbpm4表作用详解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信