jbpm4 开发拾遗

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

猜你喜欢

转载自ryanjoy.iteye.com/blog/1545925