现在项目开发又用到jbpm4了,也算是第二次搞这个了,第一次比较匆忙也没人指导,只能自己鼓捣,虽然项目是完成了,但还是留了不少疑惑。这一次再拾起来回顾了好久,也看了好些文章,总算有点体会了,上一次留下的问题也大体弄明白了,心中思路也清晰了起来。好记性不如烂笔头,功能又比较零碎,这次索性把一些常用到的东西和解决问题的思路记录下来,下次再用的时候就方便了。
1. 根据流程定义获取所有的流程节点Activity
由于我对Task的执行人和表单的权限控制是单独存放的,跟流程文件没有关系,所以在部署流程成功后,需要针对 流程定义的各个Activity尤其是Task进行权限控制等操作,所以需要取到该流程定义的所有Activity,以下是代码:
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().processDefinitionId(definitionId).uniqueResult();
ProcessDefinitionImpl definitionimpl = (ProcessDefinitionImpl)definition;
List<? extends Activity> list = definitionimpl.getActivities();
for (Activity activity : list) {
System.out.println(activity.getName()+"--"+activity.getType());
}
关键:把ProcessDefinition 强行转换为其实现类:ProcessDefinitionImpl ,然后调用getActivities()方法即可获取。
2. 对jbpm4中xxxImpl的使用
jBPM4本身维护的IoC容器就可以看到一个Environment。不打开Environment,里边的各种组件都没法使用。所以,如果使用ActivityImpl或者TaskImpl等impl类的话,必须要在Environment环境下进行。
启用Environment主要有两种方式:
1)
EnvironmentImpl env = ((EnvironmentFactory)processEngine).openEnvironment();
try{
// do sonething;
} finally{
env.close();
}
注意:直接openEnvironment不会自动维护其中的事务,如果报session closed错误,请检查是否启用spring事务或者环境是否关闭。
2)
processEngine.execute(new Command() {
public Object execute(Environment env) {
// do something:
}
});
注意:Command会自动打开Environment并维护其中的事务,执行传入的回调方法,结束后再自动将Environment关闭。
如果只是需要获得environment中的某个组件,不需要访问数据库,就可以使用openEnvironment()。
示例:获取当前任务的节点的Transitions集合
/ * 获取当前任务的节点的Transitions集合
* @param ExecutionId 当前流程实例id
* @return
*/
public List<Transition> getTransitions(final String ExecutionId) {
final List<Transition> listadd = new ArrayList<Transition>();
processEngine.execute(new Command() {
public Object execute(Environment env) {
ExecutionImpl e = (ExecutionImpl) executionService
.findExecutionById(ExecutionId);
ActivityImpl clerkOpinionActivityImpl = e.getActivity();
List<? extends Transition> list = clerkOpinionActivityImpl
.getOutgoingTransitions();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Transition ts = (Transition) iterator.next();
listadd.add(ts);
}
return list;
}
});
return listadd;
}