工作流系统研究切入点(如何去学习工作流的一个思路,这是一个业务流程的思路)
1.编写流程定义
2.部署流程
3.加载流程
4.启动流程
5.执行任务
6.完成任务
流程的定义:预定义的业务流转逻辑
流程实例:业务的一次实际流转过程
参与者:任务的执行者
活动(任务):组成流程定义的节点
活动实例:组成流程实例的元素
流转:从一个节点到另一个节点这一行为
工作列表:当前需要办理的任务集合
工作流的核心组件,对流程实例进行管理
Token是和指针(运行期的概念)代表着一条执行路径,指向当前流程中正在执行的节点在实例运行期间,tokens可能是一个树形结构,同一时刻可能存在多个token但是只有一个root token
-------------------------------------------------------------
针对Jbpm如何去按上面的思路去做呢?
1.流程的定义:可以用图形化的工具也可以自己手工写。
2.部署流程:通过加载xml文件,把xml信息转换成java信息。发布流程
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
GraphSession graphSession=jbpmContext.getGraphSession();
ProcessDefinition processDefinition=ProcessDefinition.parseXmlResource("org/test/a.xml");
//部署流程定义,如果已经存在同名的定义,则版本号会自动累加
graphSession.deployProcessDefinition(processDefinition);
jbpmContext.close();
3.加载流程和启动流程:
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
GraphSession graphSession=jbpmContext.getGraphSession();
//加载流程的定义
ProcessDefinition processDefinition=graphSession.loadProcessDefinition(processDefinitionID);//这个Id是流程的Id
//创建流程实例,启动流程
ProcessInstance processInstance=new ProcessInstance(processDefinition);
//此时,rootToken指向流程定义的第一个节点
jbpmContext.save(processInstance);
jbpmContext.close();
4.获取工作列表
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
TaskMgmtSession mgmtSession=jbpmContext.getTaskMgmtSession();
//只能获取尚未完成的任务列表(代办任务)
List list=taskMgmtSession.findTaskInstance(userId);//userid为参与者的id
//如果需要灵活的列表获取接口,需要直接使用hibernate session对象对数据进行查询
TaskInstance instance=mgmtSession.getTaskInstance(Long.parseLong(taskId));
//这两种获取列表的方式不太一样,第一个返回List,第二个返回TaskInstance对象
5.执行任务
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
TaskMgmtSession mgmtSession=jbpmCotext.getTaskMgmtSession();
TaskInstance taskInstance=mgmtSession.getTaskInstance(Long.parseLong(taskId));
taskInstance.start(); //start方法的调用标识着一个任务执行的开始,任务的开始时间会被填充
jbpmContext.save(taskInstance);
jbpmContext.close();
6.结束任务
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
TaskMgmtSession mgmtSession=jbpmContext.getTaskMgmtSession();
TaskInstance taskInstance=mgmtSession.getTaskInstance(Long.parseLong(taskId));
taskInstance.end();
jbpmContext.save(taskInstance);
jbpmContext.close();
//end方法的调用1.当前的任务实例结束,任务结束时间会被填充。2.下一个节点的初始化3.当前任务的结束和下一
//个流程的开始是在一个事物内完成,从而保证了数据的完成性
-------------------------
如何给任务设置参与者
1.用变量传递参与者Id
值一般的web层确定
2.定义配置
<task-node name="collection">
<task>
<assignment class="com.modern.Test">
<assignment actor-id='#{userid}'>
</task>
</task-node>
3.Handler实现
public class F implements AssignmentHandler{
public void assign(Assignable arg0,ExecutionContext arg1)throws Exception{
String actorId=(String)arg1.getVariable("userId");
arg0.setActorId(actorId);
}
}
---------------------
Context标识着事物
它的的底层序列化是用hibernate实现的,createContext是开启hibernatesession的过程,close 是关闭hibernatesession的过程
JbpmContext jbpmContext=JbpmConfiguration.getInstance().createJbpmContext();
try{
TaskInstance taskInstance=
.............do your process operations.............
}catch(Exception e){
}finally{
jbpmContext.close();
}
---------------------------------------
两种session的用法:
GraphSession的典型用法
职责;GraphSession处理相关的数据持久化操作,主要是ProcessDefinition 和ProcessInstance
TaskMgmtSession 的典型用法:
职责:1.TaskInstance相关的数据的查询操作
2.TaskInstance数据通过ProcessInstance进行保存它没有save方法,save是通过对processInstance的操作实现的
**********************************
jbpm是工作流的一种
jbpm_processdefinition 是工作流的流程定义
jbpm_processInstance是工作流的实例
jbpm_id_user是一个参与者
jbpm_token是这Token的一个表,其中node记录正在执行的节点
jbpm_bytearray存所上传的3个文件,生成图片是为了流程跟踪
jbpm_byteblock存的是上传文件里的内容