前面提到了实现Deployer接口扩展咱们本身的规则部署类,同时还要作一个监听器,时时监控规则脚本的变化,比较麻烦,另外也提到了activiti自身对于规则的执行方式与咱们自己的不一样,两者仍是没有统一。express
当咱们的系统扩张为分布式的时候,将规则脚本加载到本地内存并不合适,多台机器之间的加载可能并不一样步,这就形成了流程在A机器上执行的脚本与在B机器上执行的脚本不相同api
让咱们统一一下,activiti也调用咱们本身的规则执行api入口,这样就简单了,配置,传参都是经过编辑器可视化配置,只需修改BusinessRuleTaskActivityBehavior类,直接调用咱们的api,不调用RulesHelper,RulesDeployer,返回结果后,在调用流程走向api.这条路也通了,调试也都成功了,,编辑器
之前只是一个项目,项目运行加载类的时候,首先加载到咱们修改过的BusinessRuleTaskActivityBehavior,而不是去加载activiti jar包中的BusinessRuleTaskActivityBehavior,可是项目拆分为分布式的时候,问题又来了,加载顺序变了,直接修改源码带来的麻烦仍是挺多的,最好的方式是去扩展分布式
先看BusinessRuleParseHandler:ide
public class BusinessRuleParseHandler extends AbstractActivityBpmnParseHandler<BusinessRuleTask> { public Class< ? extends BaseElement> getHandledType() { return BusinessRuleTask.class; } @Override protected void executeParse(BpmnParse bpmnParse, BusinessRuleTask businessRuleTask) { ActivityImpl activity = createActivityOnCurrentScope(bpmnParse, businessRuleTask, BpmnXMLConstants.ELEMENT_TASK_BUSINESSRULE); activity.setAsync(businessRuleTask.isAsynchronous()); activity.setExclusive(!businessRuleTask.isNotExclusive()); activity.setActivityBehavior(bpmnParse.getActivityBehaviorFactory().createBusinessRuleTaskActivityBehavior(businessRuleTask)); } }
最后一段,找到ActivityBehaviorFactory实现DefaultActivityBehaviorFactory类调试
public BusinessRuleTaskActivityBehavior createBusinessRuleTaskActivityBehavior(BusinessRuleTask businessRuleTask) { BusinessRuleTaskActivityBehavior ruleActivity = null; if(StringUtils.isNotEmpty(businessRuleTask.getClassName())){ try { Class<?> clazz=Class.forName(businessRuleTask.getClassName()); ruleActivity=(BusinessRuleTaskActivityBehavior)clazz.newInstance(); } catch (Exception e) { throw new ActivitiException( "Could not instiate businessRuleTask class: ", e); } }else{ ruleActivity=new BusinessRuleTaskActivityBehavior(); }
看代码知道BusinessRuleTask有个className属性,能够配置BusinessRuleTaskActivityBehavior的子类,那就行了,新建一个类继承BusinessRuleTaskActivityBehavior,在这里实现调用咱们本身的规则,这样BusinessRuleTaskActivityBehavior也不用修改了,可是发现流程编辑器上并无给提供配置className属性的地方。code
看BusinessRuleParseHandler代码,是经过工厂模式建立的BusinessRuleTaskActivityBehavior实例,能不能实现自定义的工厂呢,而后注入咱们自定义的工厂,ActivityBehaviorFactory是一个接口,能够实现咱们本身的工厂了,看能不能经过配置文件配置注入呢,找到activiti配置引擎ProcessEngineConfigurationImpl,其中一段代码继承
if (activityBehaviorFactory == null) { DefaultActivityBehaviorFactory defaultActivityBehaviorFactory = new DefaultActivityBehaviorFactory(); defaultActivityBehaviorFactory.setExpressionManager(expressionManager); activityBehaviorFactory = defaultActivityBehaviorFactory; } else if ((activityBehaviorFactory instanceof AbstractBehaviorFactory) && ((AbstractBehaviorFactory) activityBehaviorFactory).getExpressionManager() == null) { ((AbstractBehaviorFactory) activityBehaviorFactory).setExpressionManager(expressionManager); }
若是属性activityBehaviorFactory是AbstractBehaviorFactory的实例就能够了,至此扩展就没问题了,总共扩展了两个类,工厂类,业务规则执行类接口