activiti 5.21工作流规则引擎扩展(businessRuleTask)

前面提到了实现Deployer接口扩展我们自己的规则部署类,同时还要做一个监听器,时时监控规则脚本的变化,比较麻烦,另外也提到了activiti自身对于规则的执行方式与我们本身的不同,二者还是没有统一。

当我们的系统扩张为分布式的时候,将规则脚本加载到本地内存并不合适,多台机器之间的加载可能并不同步,这就造成了流程在A机器上执行的脚本与在B机器上执行的脚本不相同

让我们统一一下,activiti也调用我们自己的规则执行api入口,这样就简单了,配置,传参都是通过编辑器可视化配置,只需修改BusinessRuleTaskActivityBehavior类,直接调用我们的api,不调用RulesHelper,RulesDeployer,返回结果后,在调用流程走向api.这条路也通了,调试也都成功了,,

以前只是一个项目,项目运行加载类的时候,首先加载到我们修改过的BusinessRuleTaskActivityBehavior,而不是去加载activiti jar包中的BusinessRuleTaskActivityBehavior,但是项目拆分为分布式的时候,问题又来了,加载顺序变了,直接修改源码带来的麻烦还是挺多的,最好的方式是去扩展

先看BusinessRuleParseHandler:

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属性的地方。

看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的实例就可以了,至此扩展就没问题了,总共扩展了两个类,工厂类,业务规则执行类

转载于:https://my.oschina.net/u/2886096/blog/1819344

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值