jbpm中各种handler怎么使用spring里面的bean方法01

jbpm中各种handler如何使用spring里面的bean方法01

jbpm中各种handler如何使用spring里面的bean?


如果处理简单的流程,task,里面的class 直接使用我们自己定义的handler就可以了(当然要实现AssignmentHandler),就算是要要添加角色名称直接使用<roleName>xxxxx</roleName>就ok了.(不用自己添加set方法去给roleName赋值,jbpm回自己赋值的,这就是实现AssignmentHandler的好处之一)

但是如果流程复杂了,需要使用spring管理的bean怎么办?可以使用spring_module里面的方案,说明如下:


Another important feature of Spring Modules jBPM integration is allowing Spring configured beans to be reused inside jBPM actions. This allows one to leverage Spring container capabilities (bean lifecycles, scoping, injection, proxying just to name a few) in a transparent way with jBPM. Consider the following Spring application context:

<beans>
 <!-- Spring bean visible inside jBPM processed -->
 <bean id="jbpmAction" class="org.MyJbpmActionHandler" singleton="true">
   <property name="someProp" ref="anotherBean"/>
   ...
 </bean>
..
</beans>
and jBPM process definition:

<?xml version="1.0" encoding="UTF-8"?>

<process-definition name="simpleWorkflow">
 <start-state>
  <transition to="myState">
  </transition>
 </start-state>

 <state name="myState">
  <transition to="end">
   <action name="myAction" config-type="bean" 
      class="org.springmodules.workflow.jbpm31.JbpmHandlerProxy">
    <targetBean>jbpmAction</targetBean>
    <factoryKey>jbpmConfiguration</factoryKey>
   </action>
  </transition>
 </state>

 <end-state name="end"/>
</process-definition>

 



例子:

jbpm流程定义文件:



<?xml version="1.0" encoding="UTF-8"?>

<process-definition
  xmlns="urn:jbpm.org:jpdl-3.2"  name="assignmentHandler3_01">
   <start-state name="开始">
      <transition name="提价给角色" to="角色审批"></transition>
   </start-state>
   <task-node name="角色审批">
   		<task name="角色审批">
   			<assignment  class="org.springmodules.workflow.jbpm31.JbpmHandlerProxy">
   				 <targetBean>myAssignmentHandler3</targetBean> 
   			</assignment>
   		</task>
      <transition name="角色审批完成" to="完成"></transition>
   </task-node>
   <end-state name="完成"></end-state>
</process-definition>


 

package cn.edu.hbmy.oa.manager.handler;

import java.util.List;

import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.taskmgmt.def.AssignmentHandler;
import org.jbpm.taskmgmt.exe.Assignable;

import cn.edu.hbmy.oa.manager.UserManager;
import cn.edu.hbmy.oa.manager.impl.BaseAutowire;

public class MyAssignmentHandler3 implements AssignmentHandler {
	//public class MyAssignmentHandler3 extends BaseAutowire implements AssignmentHandler {
	private String roleName;
	private UserManager userManager;
	
	@Override
	public void assign(Assignable assignable, ExecutionContext executionContext) throws Exception {

		if(roleName == null){
			throw new RuntimeException("角色名称不可以是空");
		}
		
		List<?> rolesName =  userManager.searchUserOfRole(roleName);
		
		
		if(rolesName.isEmpty()){
			throw new RuntimeException("角色[" + roleName+ "]还没有被分配给用户");
		}
		
		String[] role_name = rolesName.toArray(new String[rolesName.size()]);
		assignable.setPooledActors(role_name); //将角色下面的用户设置未流程实例的审批人
	}

	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}
	public void setUserManager(UserManager userManager) {
		this.userManager = userManager;
	}
 

}


这个方法虽然好,遗憾的是不能再jbpm的流程定义的xml文件里想原来那样直接提交roleName属性,但是可以再在spring的配置文件里面通过property属性添加roleName的值了


<bean id="myAssignmentHandler3" class="cn.edu.hbmy.oa.manager.handler.MyAssignmentHandler3">
		<property name="roleName" value="系统管理员"></property>
		<property name="userManager" ref="userManager"></property>
	</bean>

 


如果我们直接把jbpm的handler交给spring 管理,再利用spring依赖注入来注入spring的bean,那样是不行的,

因为jbpm自己也会创建一个handler,spring也去创建一个,二者创建的不是同一个,jbpm还是会去调用自己创建的handler,

最终给人的错觉是注入成功,其实会导致空指针异常,

还有就是如果我们把jbpm的handler里面的需要注入的bean设置为static,功能上可以实现的,不过还是创建了2个不同的handler,这样浪费内存,不大好,因此使用spring_module的方法为佳!