解读JBM3源文件 FieldInstantiation 兑现集合Field
解读JBM3源文件 FieldInstantiation 实现集合Field
以前的应用中在节点进入事件中定义ActionHandler,Field中定义人员查找的方法和查找的参数,方法似乎不错^_^ 但是人员查找的方法和参数在不同节点是不相同的(方法名,参数个数,参数值),考虑长远些,如果人员查找服务是确认的,人员查找Action也就是确认的,不用重复去设计,当人员查找服务不能满足现在需求要新增接口时,流程定义肯定要升级新版本,人员查找Action是否可以不会改动,或改动甚少呢?我想是可以的,也是想去解决的问题。
人员查找的接口、参数及参数类型可以用反射去解决。流程定义ActionHandler的Field定义为集合类型就可以应对参数类型不确定的情况。在网上逛了一阵子都没找到相关资料,Jbpm的学习资料相对较小,很多问题只能从源码下手,只得去看源码了。
从 Instantiator 接口和实现类中可以找到答案。
Field 为List的测试ActionHandler
Field 为List的流程定义部分
Field 为Map的测试ActionHandler
Field 为Map的流程定义部分
从processDefinition 到ActionHandler的类成员,jbpm通过反射实例化类,实现动态加载,所支持的类型很多,可以查看 FieldInstantiator类中的getValue(Class type, Element propertyElement)方法。思想很不错,功能确实很强大,要是定义集合类时支持多种数据类型就好了(Map<String, Object>) 哈。。。
以前的应用中在节点进入事件中定义ActionHandler,Field中定义人员查找的方法和查找的参数,方法似乎不错^_^ 但是人员查找的方法和参数在不同节点是不相同的(方法名,参数个数,参数值),考虑长远些,如果人员查找服务是确认的,人员查找Action也就是确认的,不用重复去设计,当人员查找服务不能满足现在需求要新增接口时,流程定义肯定要升级新版本,人员查找Action是否可以不会改动,或改动甚少呢?我想是可以的,也是想去解决的问题。
人员查找的接口、参数及参数类型可以用反射去解决。流程定义ActionHandler的Field定义为集合类型就可以应对参数类型不确定的情况。在网上逛了一阵子都没找到相关资料,Jbpm的学习资料相对较小,很多问题只能从源码下手,只得去看源码了。
从 Instantiator 接口和实现类中可以找到答案。
Field 为List的测试ActionHandler
public class FieldOfListTest implements ActionHandler { private static final long serialVersionUID = 1L; public List<String> parameters; public void execute(ExecutionContext executionContext) throws Exception { System.out.println(parameters); } }
Field 为List的流程定义部分
<action class="com.jbpm.test.FieldOfListTest"> <parameters element-type="java.lang.String"> <parameter>admin</parameter> <parameter>manager</parameter> </parameters> </action>
Field 为Map的测试ActionHandler
public class FieldOfMapActionTest implements ActionHandler { private static final long serialVersionUID = 1L; public Map<String, String> parameters; public void execute(ExecutionContext executionContext) throws Exception { if (parameters != null){ Iterator<Entry<String, String>> iterator = parameters.entrySet().iterator(); while(iterator.hasNext()){ Entry<String, String> entry = iterator.next(); System.out.println(entry.getKey() + ":" + entry.getValue()); } } }
Field 为Map的流程定义部分
<action class="com.jbpm.test.FieldOfMapTest"> <parameters key-type="java.lang.String" value-type="java.lang.String"> <parameter> <key>role</key> <value>ROLE_0</value> </parameter> <parameter> <key>level</key> <value>LEVEL_0</value> </parameter> </parameters> </action>
从processDefinition 到ActionHandler的类成员,jbpm通过反射实例化类,实现动态加载,所支持的类型很多,可以查看 FieldInstantiator类中的getValue(Class type, Element propertyElement)方法。思想很不错,功能确实很强大,要是定义集合类时支持多种数据类型就好了(Map<String, Object>) 哈。。。