Flowable服务组件-扩展组件

文章介绍了如何在Flowable中扩展自定义组件,特别是针对SpringCloud的微服务回调组件。通过定义`SpringCloudCallTaskActivityBehavior`、`CustomActivityBehaviorFactory`、`CustomServiceTaskParseHandler`以及相应的校验器,实现了微服务调用并在流程中集成。最后,文章强调了将这些组件注册到Spring容器并注入到引擎的重要性。

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流程引擎

### 迁移指南:从Flowable到Camunda 迁移项目从Flowable迁移到Camunda是一个复杂的过程,涉及多个方面的调整和技术决策。以下是关于如何实现这一目标的关键要点: #### 技术差异分析 Flowable和Camunda虽然都基于BPMN标准构建流程引擎,但在具体实现细节上有显著区别。例如,在数据模型设计方面,两者可能采用不同的表结构来存储运行时实例以及历史记录[^1]。 #### 数据库结构调整 由于两个平台内部机制存在差异,因此需要仔细评估现有数据库模式并制定转换策略以适应新环境下的需求特点;这通常包括但不限于修改字段名称、增加索引或者重新定义外键关系等等操作步骤以便更好地支持后续功能扩展要求的同时也能够保持良好的性能表现水平[ ^2 ]. #### API兼容性处理方案建议 尽管二者遵循相同的国际规范(Business Process Model And Notation),但由于各自开发团队对于某些特性的诠释不尽相同而导致其对外暴露出来的接口形式也可能有所出入--这就意味着当我们将应用程序从旧版升级至新版之后很可能会遇到因调用方式改变而引发的各种异常情况发生.[^3] 针对这种情况可以考虑采取如下措施加以应对: - 审查所有涉及到工作流管理部分的源代码片段找出潜在风险点. - 创建适配层用来屏蔽底层变化带来的影响从而减少改动范围提高维护效率. ```java public class WorkflowAdapter { private final CamundaService camundaService; public void startProcess(String processDefinitionKey){ // 将原本用于启动flowable进程的方法映射到这里执行camunda对应逻辑 camundaService.startProcessInstanceByKey(processDefinitionKey); } } ``` #### 用户界面自定义保留方法论探讨 如果当前系统已经定制化了很多专属页面给最终用户提供交互体验的话,则还需要额外关注这部分内容能否顺利过渡过去而不丢失原有的风格特色等问题解答思路如下所示: 通过提取公共组件的方式建立统一的标准框架体系架构图谱使得无论是在哪个版本之上都能够快速搭建起相似效果的新模块出来;与此同时也要注意收集反馈意见不断优化改进直至达到满意为止 。[^4]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小学生05101

flowable

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

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

打赏作者

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

抵扣说明:

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

余额充值