现在项目开发又用到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; }