JBPM的简单总结

安装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>


POJO实体类
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();
}

//创建公文
//创建流程实例,将公文并与流程实例绑定

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();

第一个节点对应的用户登录,应该能够查询到其当前的任务(有公文等待其审批)
* 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();


- 查找到当前的任务对应的公文之后,即可对其审批,并继续往下走
* 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+"已被审批完成");
}

- 如此,直到结束
* 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值