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的方法为佳!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值