Flowable服务组件-扩展组件

Flowable服务组件-扩展组件

✨✨✨ 最好用的Flowable流程设计器



前言

Flowable给我们提供了非常丰富的组件,但是在实际场景中,我们有需要企业个性化的组件,如何扩展自己的组件至关重要

在这里插入图片描述

一、扩展微服务回调组件

现在企业中使用springcloud居多,如果在审批流程中需要调用微服务去和业务系统就行交互就显得很重要,但是如何实现它呢,接下来由我带着大家慢慢实现微服务回调组件

二、程序步骤

1.定义我们的扩展组件 SpringCloudCallTaskActivityBehavior

代码如下:

@Slf4j
public class SpringCloudCallTaskActivityBehavior extends AbstractCustomBpmnActivityBehavior {
    //nacos服务id
    protected Expression serviceId;
    //url
    protected Expression url;
    //请求方法名
    protected Expression method;
    //参数
    protected Expression params;
    //是否保存请求结果
    protected Expression saveResponseParameters;
    //保存请求结果的变量名
    protected Expression responseVariableName;

    @Override
    public void execute(DelegateExecution execution) {
        SpringCloudBusinessCallModel callModel = this.createSpringCloudBusinessCallModel(execution, serviceId, url, method, params);
        DynamicFeignClientFactory<DynamicClient> dynamicFeignClientFactory = SpringBpmnUtil.getBean(DynamicFeignClientFactory.class);
        DynamicClient dynamicClient = dynamicFeignClientFactory.getFeignClient(DynamicClient.class, callModel.getServiceId(), callModel.getUrl());
        Map<String, Object> params = FastJsonUtils.fastJsonBean2Map(callModel);
        JsonNode jsonNode = null;
        try {
            JSONObject responseValueJson = dynamicClient.postExecute(params);
            ObjectMapper mapper = new ObjectMapper();
            jsonNode = mapper.readTree(responseValueJson.toJSONString());
        } catch (Exception e) {
            log.error("调用出差或转化出错", e);
        }
        String saveResponseParametersStr = this.getStrExpression(saveResponseParameters, execution);
        if (StringUtils.isNotBlank(saveResponseParametersStr) && "true".equalsIgnoreCase(saveResponseParametersStr)) {
            execution.setVariable(this.getStrExpression(responseVariableName, execution), jsonNode);
        }
        this.leave(execution);
    }
}

注:如果springcloud动态调用服务不清楚,可以参考我们以前的博客
springcloud动态调用服务

2.定义自定义ActivityBehaviorFactory

代码如下:

public class CustomActivityBehaviorFactory extends DefaultActivityBehaviorFactory {

    //创建自定义SpringCloudCallTaskActivityBehavior
    public SpringCloudCallTaskActivityBehavior createSpringCloudCallTaskActivityBehavior(ServiceTask serviceTask) {
        List<FieldDeclaration> fieldDeclarations = super.createFieldDeclarations(serviceTask.getFieldExtensions());
        return (SpringCloudCallTaskActivityBehavior) ClassDelegate.defaultInstantiateDelegate(SpringCloudCallTaskActivityBehavior.class, fieldDeclarations);
    }

3.定义自定义ServiceTaskParseHandler

代码如下:

public class CustomServiceTaskParseHandler extends ServiceTaskParseHandler {

    @Override
    protected void executeParse(BpmnParse bpmnParse, ServiceTask serviceTask) {
        if (StringUtils.isNotEmpty(serviceTask.getType())) {
            if ("sc".equalsIgnoreCase(serviceTask.getType())){
                CustomActivityBehaviorFactory activityBehaviorFactory = (CustomActivityBehaviorFactory) bpmnParse.getActivityBehaviorFactory();
             serviceTask.setBehavior(activityBehaviorFactory.createSpringCloudCallTaskActivityBehavior(serviceTask));
            }
        super.executeParse(bpmnParse, serviceTask);
    }
}

3.除了定义组件和handler我们还需要自定义校验

3.1自定义校验ServiceTaskValidator

代码如下:

public class CustomServiceTaskValidator extends ServiceTaskValidator {
    //微服务任务
    public static final String SC_TASK = "sc";
    //校验服务任务
    @Override
    protected void verifyType(Process process, ServiceTask serviceTask, List<ValidationError> errors) {
        if (StringUtils.isNotEmpty(serviceTask.getType())) {
            switch (serviceTask.getType()) {
                case SC_TASK:
                    this.validateFieldDeclarationsForSpringCloud(process, serviceTask, serviceTask.getFieldExtensions(), errors);
                    break;
                default:
                    super.verifyType(process, serviceTask, errors);
                    break;
            }
        }
    }

    //校验springcloud类型的服务任务
    private void validateFieldDeclarationsForSpringCloud(Process process, TaskWithFieldExtensions task, List<FieldExtension> fieldExtensions, List<ValidationError> errors) {
        boolean serviceIdDefined = false;
        boolean urlDefined = false;
        for (FieldExtension fieldExtension : fieldExtensions) {
            if (fieldExtension.getFieldName().equals("serviceId")) {
                serviceIdDefined = true;
            }
            if (fieldExtension.getFieldName().equals("url")) {
                urlDefined = true;
            }
        }
        if (!serviceIdDefined) {
            addError(errors, "flowable-sc-no-serviceId", process, task, "ScCall节点没有配置serviceId");
        }
        if (!urlDefined) {
            addError(errors, "flowable-sc-no-url", process, task, "ScCall节点没有配置url");
        }
    }

3.1自定义校验工厂 ProcessValidatorFactory

代码如下:

public class CustomProcessValidatorFactory extends ProcessValidatorFactory {

    @Override
    public ProcessValidator createDefaultProcessValidator() {
        ProcessValidatorImpl processValidator = new ProcessValidatorImpl();
        ValidatorSet validatorSet = new ValidatorSetFactory().createFlowableExecutableProcessValidatorSet();
        validatorSet.removeValidator(ServiceTaskValidator.class);
        validatorSet.addValidator(new CustomServiceTaskValidator());
        processValidator.addValidatorSet(validatorSet);
        return processValidator;
    }
}

4.还没有完,我们要把我们定义的这些组件交给spring容器然后给引擎注入进去

代码如下:

.....基本配置省略
   //自定义组件
        List<BpmnParseHandler> customServiceTaskParseHandlers = new ArrayList<>();
        customServiceTaskParseHandlers.add(customServiceTaskParseHandler());
        configuration.setCustomDefaultBpmnParseHandlers(customServiceTaskParseHandlers);
        configuration.setActivityBehaviorFactory(customActivityBehaviorFactory());
        configuration.setProcessValidator(customProcessValidatorFactory().createDefaultProcessValidator());
    }

    @Bean
    public CustomServiceTaskParseHandler customServiceTaskParseHandler() {
        return new CustomServiceTaskParseHandler();
    }

    @Bean
    public CustomActivityBehaviorFactory customActivityBehaviorFactory() {
        return new CustomActivityBehaviorFactory();
    }

    @Bean
    public CustomProcessValidatorFactory customProcessValidatorFactory() {
        return new CustomProcessValidatorFactory();
    }

总结

以上就是今天要讲的内容,这样子我们就可以随意扩展自己的自定义组件了,记得我们所有的扩展都是为企业服务的,不是为了扩展而扩展,实际能落地才是具备价值的。在这里也感谢贺波同学提供的支持,他写的一本activiti可读性很高,代码质量也非常不错,推荐给大家。
在这里插入图片描述

视频地址:
FlowableBpmn2.0组件讲解
本文中内容和案例出自贺波老师的书《深入Activiti流程引擎:核心原理与高阶实战》,书中的介绍更全面、详细,推荐给大家。
深入Activiti流程引擎

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生05101

flowable

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值