记录自己在学习和使用jbpm过程中遇到的一些问题和解决方法以及一些jbpm的学习资料
May
5
JBoss Goup 目前已经发布了 jBPM4 Alpha1 版本,在版本 4 中最大的变化就是引入 PVM (流程虚拟机)的概念,而引擎内部的调度算法中重要的 Token 机制,在新版中也去掉了,纵观整个代码,变化可以说非常的大,笔者接下来就试着来比较一下这种变化,让大家能有个直观的认识。当然 Jbpm4 在 JBoss 的官方网站上的 Road map 中,在今年的 7 月 1 号才会发布第一个正式版本,因此后续可能还会有变化。
1、 流程定义对象的变化:
Jbpm3 流程定义对象关系图:

图一 jbpm3流程定义对象关系图
从上图我们可以看出这 jbpm3 中, GraphElement 是流程图中所有流程元素的父对象,而整个流程是由 ProcessDefinition 、 Node 、 Transition 三个主要对象构成;

图二 PVM 实体对象关系图
1、 流程定义对象的变化:
Jbpm3 流程定义对象关系图:
图一 jbpm3流程定义对象关系图
从上图我们可以看出这 jbpm3 中, GraphElement 是流程图中所有流程元素的父对象,而整个流程是由 ProcessDefinition 、 Node 、 Transition 三个主要对象构成;
图二 PVM 实体对象关系图
Apr
13
启动流程:
Ø 获取最新的流程定义:
JbpmContext.getCurrentJbpmContext().getGraphSession().findLatestProcessDefinitions();//返回List
Ø 获取指定流程定义:
ProcessDefinition processDefinition =
graphSession.loadProcessDefinition(processDefinitionId);
Ø 创建流程实例:
ProcessInstance processInstance = new ProcessInstance(processDefinition);
Ø 开始任务节点:
TaskInstance taskInstance =
processInstance.getTaskMgmtInstance().createStartTaskInstance();
Ø 获取指定任务实例(ID):
TaskMgmtSession taskMgmtSession;
taskMgmtSession = jbpmContext.getTaskMgmtSession();
TaskInstance taskInstance = taskMgmtSession.loadTaskInstance(taskInstanceId);
Ø 获取任务列表:
taskMgmtSession.findTaskInstances(userName);//userName为指派的人名(或角色名)
Ø 获取任务变量:
TaskController taskController = taskInstance.getTask().getTaskController();
List variableAccesses = taskController.getVariableAccesses();
注:TaskController 有两个关键的函数 initializeVariables,submitParameters,一个用来从流程中把变量置入task实例,另一个则相反,把task中变量更新到流程变量
Ø 根据流程定义找到相关的任务定义
ProcessDefinition pd = jbpmContext.getGraphSession().getProcessDefinition(id);
List tasklist = pd.getTaskMgmtDefinition().getTasks();
Ø 根据流程实例找到任务实例
taskMgmtSession.findTaskInstancesByProcessInstance(processInstance);
原文地址 http://orz.javaeye.com/blog/89885
Ø 获取最新的流程定义:
JbpmContext.getCurrentJbpmContext().getGraphSession().findLatestProcessDefinitions();//返回List
Ø 获取指定流程定义:
ProcessDefinition processDefinition =
graphSession.loadProcessDefinition(processDefinitionId);
Ø 创建流程实例:
ProcessInstance processInstance = new ProcessInstance(processDefinition);
Ø 开始任务节点:
TaskInstance taskInstance =
processInstance.getTaskMgmtInstance().createStartTaskInstance();
Ø 获取指定任务实例(ID):
TaskMgmtSession taskMgmtSession;
taskMgmtSession = jbpmContext.getTaskMgmtSession();
TaskInstance taskInstance = taskMgmtSession.loadTaskInstance(taskInstanceId);
Ø 获取任务列表:
taskMgmtSession.findTaskInstances(userName);//userName为指派的人名(或角色名)
Ø 获取任务变量:
TaskController taskController = taskInstance.getTask().getTaskController();
List variableAccesses = taskController.getVariableAccesses();
注:TaskController 有两个关键的函数 initializeVariables,submitParameters,一个用来从流程中把变量置入task实例,另一个则相反,把task中变量更新到流程变量
Ø 根据流程定义找到相关的任务定义
ProcessDefinition pd = jbpmContext.getGraphSession().getProcessDefinition(id);
List tasklist = pd.getTaskMgmtDefinition().getTasks();
Ø 根据流程实例找到任务实例
taskMgmtSession.findTaskInstancesByProcessInstance(processInstance);
原文地址 http://orz.javaeye.com/blog/89885
Apr
13
在集成SSH+jbpm的过程中,遇到了错误,“ERROR org.jbpm.persistence.db.DbPersistenceService - hibernate commit failed”,在网上搜了很多资料没有找到解决方法,没有办法只能自己调试程序试着找原因了,最终发现了问题所在。特记录如下:
我在集成过程中,部署流程已经成功,但是在使用spring自动生成的jbpmTemplate bean来保存流程实例ProcessInstance时却报错,调试跟踪错误是出在了“jbpmContext.close()”这里。原因是这样的:
springmodules提供的“org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean”类来创建ProcessDefinition流程定义实例,并且注入到JbpmTemplate实例中,而在创建ProcessDefinition流程实例时只是从xml读取流程实例,并不是从数据库中找到流程定义的最后版本,所以导致创建的流程定义的id是0,也就是没有进行持久化,所以我们使用该流程定义创建了流程实例后,又要对该流程实例保存时,流程实例和流程定义有外键关系,导致提交失败。
错误出现在“jbpmContext.close()”,是因为在这句才结束事务,实际提交数据,也就出现了hibernate commit failed的错误。
解决方法:
如果哪里还没有明白,可以去参考下org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean的源代码,就明白为什么spring获取的流程定义对象不能创建能保存到数据库的流程实例了。
最后再说明下,spring自己创建的流程对象如果当次部署过的话是可以创建流程实例并保存到数据库的,这是因为部署流程后流程定义就有id了,也就是持久化过了,这关系到jbpm和SSH的集成的方法,这方面的资料网上可以找到一些,大家就参考下网上其他的资料吧。
我在集成过程中,部署流程已经成功,但是在使用spring自动生成的jbpmTemplate bean来保存流程实例ProcessInstance时却报错,调试跟踪错误是出在了“jbpmContext.close()”这里。原因是这样的:
springmodules提供的“org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean”类来创建ProcessDefinition流程定义实例,并且注入到JbpmTemplate实例中,而在创建ProcessDefinition流程实例时只是从xml读取流程实例,并不是从数据库中找到流程定义的最后版本,所以导致创建的流程定义的id是0,也就是没有进行持久化,所以我们使用该流程定义创建了流程实例后,又要对该流程实例保存时,流程实例和流程定义有外键关系,导致提交失败。
错误出现在“jbpmContext.close()”,是因为在这句才结束事务,实际提交数据,也就出现了hibernate commit failed的错误。
解决方法:
JbpmContext jbpmContext = jbpmTemplate.getJbpmConfiguration().createJbpmContext();
try{
GraphSession graphSession = jbpmContext.getGraphSession();
//获取流程实例,这样是从数据库中解析流程实例的最后版本
ProcessDefinition definition = graphSession.findLatestProcessDefinition("simple");
//这里注释掉的是原来使用的代码,这样的话用的是spring生成的流程定义对象,是从xml解析来的
// ProcessInstance pi = new ProcessInstance(jbpmTemplate.getProcessDefinition());
ProcessInstance pi = definition.createProcessInstance();
jbpmContext.save(pi);
}
finally{
jbpmContext.close();
}
try{
GraphSession graphSession = jbpmContext.getGraphSession();
//获取流程实例,这样是从数据库中解析流程实例的最后版本
ProcessDefinition definition = graphSession.findLatestProcessDefinition("simple");
//这里注释掉的是原来使用的代码,这样的话用的是spring生成的流程定义对象,是从xml解析来的
// ProcessInstance pi = new ProcessInstance(jbpmTemplate.getProcessDefinition());
ProcessInstance pi = definition.createProcessInstance();
jbpmContext.save(pi);
}
finally{
jbpmContext.close();
}
如果哪里还没有明白,可以去参考下org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean的源代码,就明白为什么spring获取的流程定义对象不能创建能保存到数据库的流程实例了。
最后再说明下,spring自己创建的流程对象如果当次部署过的话是可以创建流程实例并保存到数据库的,这是因为部署流程后流程定义就有id了,也就是持久化过了,这关系到jbpm和SSH的集成的方法,这方面的资料网上可以找到一些,大家就参考下网上其他的资料吧。





