安装JBPM
- 引入Hibernate依赖包
- 引入JBPM依赖包
* bsh.jar
* jcr-1.0.jar
* jbpm-identity.jar
* jbpm-jpdl.jar
- 引入数据库驱动
定义相关配置文件
- Hibernate配置文件
* 提供hibernate配置文件(可以从config/目录下拷贝,并修改其中的数据库连接设置即可)
定义流程的文档
- <process-definition name="文档测试流程">
- <start-state name="开始">
- <transition name="提交张三审批" to="张三审批"></transition>
- </start-state>
- <task-node name="张三审批">
- <task name="审批1">
- <assignment actor-id="张三"/>
- </task>
- <transition name="提交李四审批" to="李四审批"></transition>
- </task-node>
- <task-node name="李四审批">
- <task name="审批2">
- <assignment actor-id="李四"/>
- </task>
- <transition name="提交王五审批" to="王五审批"></transition>
- </task-node>
- <task-node name="王五审批">
- <task name="审批3">
- <assignment actor-id="王五"/>
- </task>
- <transition name="结束流程" to="结束"></transition>
- </task-node>
- <end-state name="结束"></end-state>
- </process-definition>
<process-definition name="文档测试流程"> <start-state name="开始"> <transition name="提交张三审批" to="张三审批"></transition> </start-state> <task-node name="张三审批"> <task name="审批1"> <assignment actor-id="张三"/> </task> <transition name="提交李四审批" to="李四审批"></transition> </task-node> <task-node name="李四审批"> <task name="审批2"> <assignment actor-id="李四"/> </task> <transition name="提交王五审批" to="王五审批"></transition> </task-node> <task-node name="王五审批"> <task name="审批3"> <assignment actor-id="王五"/> </task> <transition name="结束流程" to="结束"></transition> </task-node> <end-state name="结束"></end-state> </process-definition>
POJO实体类
- public class Document {
- private int id;
- private String title;
- private String content;
- private String creator;
- private Long processIntanceId;
- }
public class Document {
private int id;
private String title;
private String content;
private String creator;
private Long processIntanceId;
}
//在数据库中创建表格
JbpmConfiguration.getInstance().createSchema();
//部署流程
- JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- try{
- context.deployProcessDefinition(processDefinition);
- }finally{
- //context对象需要关闭
- context.close();
- }
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
context.deployProcessDefinition(processDefinition);
}finally{
//context对象需要关闭
context.close();
}
//创建公文
//创建流程实例,将公文并与流程实例绑定
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- context.setSessionFactory(HibernateUtils.getSessionFactory());
- //从数据库中加载ProcessDefinition对象
- ProcessDefinition definition = context.getGraphSession().findLatestProcessDefinition("文档测试流程");
- //从流程中创建一个流程实例
- ProcessInstance processInstance = new ProcessInstance(definition);
- //存储流程实例
- context.save(processInstance);
- //加载公文
- Document doc = (Document)context.getSession().load(Document.class, 1);
- //绑定流程实例到公文
- doc.setProcessIntanceId(processInstance.getId());
- //绑定公文到流程实例(ContextInstance相当于一个变量的容器)
- processInstance.getContextInstance().createVariable("document", doc.getId());
- context.close();
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSessionFactory(HibernateUtils.getSessionFactory());
//从数据库中加载ProcessDefinition对象
ProcessDefinition definition = context.getGraphSession().findLatestProcessDefinition("文档测试流程");
//从流程中创建一个流程实例
ProcessInstance processInstance = new ProcessInstance(definition);
//存储流程实例
context.save(processInstance);
//加载公文
Document doc = (Document)context.getSession().load(Document.class, 1);
//绑定流程实例到公文
doc.setProcessIntanceId(processInstance.getId());
//绑定公文到流程实例(ContextInstance相当于一个变量的容器)
processInstance.getContextInstance().createVariable("document", doc.getId());
context.close();
获得流程实例对象,并触发流程实例走向下一步
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- context.setSessionFactory(HibernateUtils.getSessionFactory());
- Document doc = (Document)context.getSession().load(Document.class, 1);
- ProcessInstance processInstance = context.getProcessInstance(doc.getProcessIntanceId());
- //触发流程实例走向下一步
- processInstance.getRootToken().signal();
- //获得当前流程节点的名字
- processInstance.getRootToken().getNode().getName()
- context.close();
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSessionFactory(HibernateUtils.getSessionFactory());
Document doc = (Document)context.getSession().load(Document.class, 1);
ProcessInstance processInstance = context.getProcessInstance(doc.getProcessIntanceId());
//触发流程实例走向下一步
processInstance.getRootToken().signal();
//获得当前流程节点的名字
processInstance.getRootToken().getNode().getName()
context.close();
第一个节点对应的用户登录,应该能够查询到其当前的任务(有公文等待其审批)
* List tasks = context.getTaskMgmtSession().findTaskInstances("张三"); - 查找张三的任务列表
* 列表元素是TaskInstance实例
* 通过:taskInstance.getProcessInstance().getContextInstance().getVariable("document"); 可以找到其绑定的公文ID
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- context.setSessionFactory(HibernateUtils.getSessionFactory());
- List tasks = context.getTaskMgmtSession().findTaskInstances("张三");
- System.err.println("张三的文档有:");
- for (Iterator iter = tasks.iterator(); iter.hasNext();) {
- TaskInstance taskInstance = (TaskInstance) iter.next();
- Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
- System.err.println(docId);
- }
- List tasks1 = context.getTaskMgmtSession().findTaskInstances("李四");
- System.err.println("李四的文档有:");
- for (Iterator iter = tasks1.iterator(); iter.hasNext();) {
- TaskInstance taskInstance = (TaskInstance) iter.next();
- Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
- System.err.println(docId);
- }
- List tasks2 = context.getTaskMgmtSession().findTaskInstances("王五");
- System.err.println("王五的文档有:");
- for (Iterator iter = tasks2.iterator(); iter.hasNext();) {
- TaskInstance taskInstance = (TaskInstance) iter.next();
- Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
- System.err.println(docId);
- }
- context.close();
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSessionFactory(HibernateUtils.getSessionFactory());
List tasks = context.getTaskMgmtSession().findTaskInstances("张三");
System.err.println("张三的文档有:");
for (Iterator iter = tasks.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
System.err.println(docId);
}
List tasks1 = context.getTaskMgmtSession().findTaskInstances("李四");
System.err.println("李四的文档有:");
for (Iterator iter = tasks1.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
System.err.println(docId);
}
List tasks2 = context.getTaskMgmtSession().findTaskInstances("王五");
System.err.println("王五的文档有:");
for (Iterator iter = tasks2.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
System.err.println(docId);
}
context.close();
- 查找到当前的任务对应的公文之后,即可对其审批,并继续往下走
* taskInstance.end();
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- context.setSessionFactory(HibernateUtils.getSessionFactory());
- List tasks = context.getTaskMgmtSession().findTaskInstances("张三");
- for (Iterator iter = tasks.iterator(); iter.hasNext();) {
- TaskInstance taskInstance = (TaskInstance) iter.next();
- //张三已经审批结束,继续提交,这将触发流程继续向下流动!
- taskInstance.end();
- Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
- System.err.println(docId+"已被审批完成");
- }
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSessionFactory(HibernateUtils.getSessionFactory());
List tasks = context.getTaskMgmtSession().findTaskInstances("张三");
for (Iterator iter = tasks.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
//张三已经审批结束,继续提交,这将触发流程继续向下流动!
taskInstance.end();
Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
System.err.println(docId+"已被审批完成");
}
- 如此,直到结束
* processInstance.hasEnded() - 如果流程已经到达终点,本调用将返回true
- //部署流程定义
- getJbpmContext().deployProcessDefinition(pdf);
- //删除流程定义
- List defs = getJbpmContext().getGraphSession().findAllProcessDefinitionVersions(workFlow.getName());
- for (Iterator iterator = defs.iterator(); iterator.hasNext();) {
- ProcessDefinition pdf = (ProcessDefinition) iterator.next();
- getJbpmContext().getGraphSession().deleteProcessDefinition(pdf);
- }
- //创建流程实例,先根据流程定义的名称获得流程定义对象,获得流程定义(GraphSession对象)
- GraphSession graphSession = context.getGraphSession();
- //findLatestProcessDefinition查找最新的流程定义,根据流程名称
- ProcessDefinition process = context.getGraphSession().findLatestProcessDefinition(workFlowName);
- ProcessInstance instance = new ProcessInstance(process);
- //绑定到文档,根据文档的ID
- instance.getContextInstance().createVariable("documnet", documentId);
- context.save(instance);
- //删除流程实例
- context.getGraphSession().deleteProcessInstance(processInstanceId);
- //获得一个流程实例,根据ID
- ProcessInstance processInstance = jbpmContext.getProcessInstance(doc.getProcessIntanceId());
- //获量(TaskInstance)流程实例的数组(根据用户名字)
- List task = context.getTaskMgmtSession().findTaskInstances(username);
- for (Iterator iterator = task.iterator(); iterator.hasNext();) {
- TaskInstance taskInstance = (TaskInstance)iterator.next();
- //是否
- if(!taskInstance.isSignalling()){
- continue;
- }
- //先获得ProcessInstance,再获得ContextInstance,再getVariable,(创建的时候是setVariable)
- //得到的是文档的ID
- Integer i = (Integer) taskInstance.getProcessInstance().getContextInstance().getVariable("document");
- docIds.add(i);
- }
- //获得当前节点和起始节点
- String currentNodeName = instance.getRootToken().getNode().getName();
- String startNodeName = instance.getProcessDefinition().getStartState().getName();
- /**
- * 搜索下一步的流向,即下一步都可以走哪些路径
- * Parameters:
- * username
- * processInstanceId
- * Returns:
- * 流向的名称列表
- */
- public List searchNextTransitions(String username, long processInstanceId) {
- JbpmContext context = getJbpmContext();
- List transitions = new ArrayList();
- ProcessInstance instance = context.getProcessInstance(processInstanceId);
- String currentNodeName = instance.getRootToken().getNode().getName();
- String startNodeName = instance.getProcessDefinition().getStartState().getName();
- Collection nextSteps = null;
- //如果当前节点和起始节点相等
- if(currentNodeName.equals(startNodeName)){
- //获得走向的Set集合
- nextSteps = instance.getRootToken().getAvailableTransitions();
- }else{
- //如果当前节点不是起始节点,获得用户的TaskInstance
- List list = context.getTaskMgmtSession().findTaskInstances(username);
- for (Iterator iterator = list.iterator(); iterator.hasNext();) {
- TaskInstance taskInstance = (TaskInstance) iterator.next();
- //如果相等,获得走向的Set集合
- if(taskInstance.getProcessInstance().getId()==processInstanceId){
- nextSteps = taskInstance.getAvailableTransitions();
- break;
- }
- }
- }
- //只获得名字
- for (Iterator iterator = nextSteps.iterator(); iterator.hasNext();) {
- Transition transition = (Transition) iterator.next();
- transitions.add(transition.getName());
- }
- return transitions;
- }
- //流向下一步
- public String flowToNextStep(String username, long processInstanceId,
- String transitionName) {
- JbpmContext jbpmContext = getJbpmContext();
- String status = null;
- ProcessInstance instance = jbpmContext.getProcessInstance(processInstanceId);
- String currentName = instance.getRootToken().getNode().getName();
- String startName = instance.getProcessDefinition().getStartState().getName();
- if(currentName.equals(startName)){
- //起始节点,流向指定的transitionName
- instance.getRootToken().signal(transitionName);
- }else{
- List task = jbpmContext.getTaskMgmtSession().findTaskInstances(username);
- for (Iterator iterator = task.iterator(); iterator.hasNext();) {
- TaskInstance taskInstance = (TaskInstance) iterator.next();
- if(taskInstance.getProcessInstance().getId()==processInstanceId){
- //非起始节点,流向指定的transitionName
- taskInstance.end(transitionName);
- break;
- }
- }
- }
- //获得当前的Token
- status = instance.getRootToken().getName();
- if(instance.hasEnded()){
- status = Document.STATUS_END;
- }
- return status;
- }
//部署流程定义
getJbpmContext().deployProcessDefinition(pdf);
//删除流程定义
List defs = getJbpmContext().getGraphSession().findAllProcessDefinitionVersions(workFlow.getName());
for (Iterator iterator = defs.iterator(); iterator.hasNext();) {
ProcessDefinition pdf = (ProcessDefinition) iterator.next();
getJbpmContext().getGraphSession().deleteProcessDefinition(pdf);
}
//创建流程实例,先根据流程定义的名称获得流程定义对象,获得流程定义(GraphSession对象)
GraphSession graphSession = context.getGraphSession();
//findLatestProcessDefinition查找最新的流程定义,根据流程名称
ProcessDefinition process = context.getGraphSession().findLatestProcessDefinition(workFlowName);
ProcessInstance instance = new ProcessInstance(process);
//绑定到文档,根据文档的ID
instance.getContextInstance().createVariable("documnet", documentId);
context.save(instance);
//删除流程实例
context.getGraphSession().deleteProcessInstance(processInstanceId);
//获得一个流程实例,根据ID
ProcessInstance processInstance = jbpmContext.getProcessInstance(doc.getProcessIntanceId());
//获量(TaskInstance)流程实例的数组(根据用户名字)
List task = context.getTaskMgmtSession().findTaskInstances(username);
for (Iterator iterator = task.iterator(); iterator.hasNext();) {
TaskInstance taskInstance = (TaskInstance)iterator.next();
//是否
if(!taskInstance.isSignalling()){
continue;
}
//先获得ProcessInstance,再获得ContextInstance,再getVariable,(创建的时候是setVariable)
//得到的是文档的ID
Integer i = (Integer) taskInstance.getProcessInstance().getContextInstance().getVariable("document");
docIds.add(i);
}
//获得当前节点和起始节点
String currentNodeName = instance.getRootToken().getNode().getName();
String startNodeName = instance.getProcessDefinition().getStartState().getName();
/**
* 搜索下一步的流向,即下一步都可以走哪些路径
* Parameters:
* username
* processInstanceId
* Returns:
* 流向的名称列表
*/
public List searchNextTransitions(String username, long processInstanceId) {
JbpmContext context = getJbpmContext();
List transitions = new ArrayList();
ProcessInstance instance = context.getProcessInstance(processInstanceId);
String currentNodeName = instance.getRootToken().getNode().getName();
String startNodeName = instance.getProcessDefinition().getStartState().getName();
Collection nextSteps = null;
//如果当前节点和起始节点相等
if(currentNodeName.equals(startNodeName)){
//获得走向的Set集合
nextSteps = instance.getRootToken().getAvailableTransitions();
}else{
//如果当前节点不是起始节点,获得用户的TaskInstance
List list = context.getTaskMgmtSession().findTaskInstances(username);
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iterator.next();
//如果相等,获得走向的Set集合
if(taskInstance.getProcessInstance().getId()==processInstanceId){
nextSteps = taskInstance.getAvailableTransitions();
break;
}
}
}
//只获得名字
for (Iterator iterator = nextSteps.iterator(); iterator.hasNext();) {
Transition transition = (Transition) iterator.next();
transitions.add(transition.getName());
}
return transitions;
}
//流向下一步
public String flowToNextStep(String username, long processInstanceId,
String transitionName) {
JbpmContext jbpmContext = getJbpmContext();
String status = null;
ProcessInstance instance = jbpmContext.getProcessInstance(processInstanceId);
String currentName = instance.getRootToken().getNode().getName();
String startName = instance.getProcessDefinition().getStartState().getName();
if(currentName.equals(startName)){
//起始节点,流向指定的transitionName
instance.getRootToken().signal(transitionName);
}else{
List task = jbpmContext.getTaskMgmtSession().findTaskInstances(username);
for (Iterator iterator = task.iterator(); iterator.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iterator.next();
if(taskInstance.getProcessInstance().getId()==processInstanceId){
//非起始节点,流向指定的transitionName
taskInstance.end(transitionName);
break;
}
}
}
//获得当前的Token
status = instance.getRootToken().getName();
if(instance.hasEnded()){
status = Document.STATUS_END;
}
return status;
}