Flowable服务组件-扩展组件

news2024/10/7 8:29:04

Flowable服务组件-扩展组件

扩展组件


文章目录

  • Flowable服务组件-扩展组件
  • 前言
    • Flowable给我们提供了非常丰富的组件,但是在实际场景中,我们有需要企业个性化的组件,如何扩展自己的组件至关重要
  • 一、扩展微服务回调组件
  • 二、程序步骤
    • 1.定义我们的扩展组件 SpringCloudCallTaskActivityBehavior
    • 2.定义自定义ActivityBehaviorFactory
    • 3.定义自定义ServiceTaskParseHandler
    • 3.除了定义组件和handler我们还需要自定义校验
      • 3.1自定义校验ServiceTaskValidator
      • 3.1自定义校验工厂 ProcessValidatorFactory
    • 4.还没有完,我们要把我们定义的这些组件交给spring容器然后给引擎注入进去
  • 总结


前言

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可读性很高,代码质量也非常不错,推荐给大家。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

618父亲节,感恩的祝福送给父亲!

父亲节&#xff08;Fathers Day&#xff09;&#xff0c;是感恩父亲的节日。Fathers day, is a day of thanksgiving for fathers. 第一个提出父亲节理念的人是1906年的多德夫人。她想用一个特殊的日子来纪念她的父亲&#xff0c;她的妈妈多年前就去世了。起初&#xff0c;多德…

1.4 场效应管

1.什么是场效应管&#xff1f; 场效应管&#xff08;Field-Effect Transistor&#xff0c;简称FET&#xff09;是一种基于电场效应调控电流的三端器件。它是一种用于电子电路中的重要元件&#xff0c;常用于放大信号、开关电路和模拟电路等应用。 场效应管主要由一个导电的沟…

git 的详细介绍使用

点击下载&#xff1a;Git下载地址 下载完成后在本地文件夹空白位置右键能看到即为安装成功 git简介&#xff1a;git是一个版本控制系统&#xff0c;见下方图详解 快速查看git的全局配置项 git config --list --global 查看指定的全局配置项 git config user.name git conf…

【Git删除大文件失败,提示WARNING: Ref ‘refs/heads/master‘ is unchanged的解决思路】

1. 问题描述 最近使用Gitee一直在独立开发某个项目&#xff0c;某次因为某个测试文件比较大&#xff0c;超过了100MB&#xff0c;gitee无法接受&#xff0c;上传失败。但是当时我没有发现上传失败&#xff0c;就没有处理&#xff0c;等到今天发现的时候&#xff0c;已经提交过…

Low-Light Image Enhancement with Wavelet-based Diffusion Models

Abstract 扩散模型在图像恢复任务中取得了很好的效果&#xff0c;但存在时间长、计算资源消耗大、恢复不稳定等问题。为了解决这些问题&#xff0c;我们提出了一种鲁棒和高效的基于扩散的微光图像增强方法&#xff0c;称为DiffLL。具体来说&#xff0c;我们提出了一个基于小波…

Vulnhub靶机:ME AND MY GIRLFRIEND_ 1

目录 介绍信息收集主机发现主机信息探测 网站探测SSH爆破 & 提权 介绍 系列&#xff1a;Me and My Girlfriend&#xff08;此系列共1台&#xff09; 发布日期&#xff1a;2019 年 12 月 13 日 难度&#xff1a;初级 运行环境&#xff1a;VMware 目标&#xff1a;取得 root…

Linux——MySQL数据库部署及自建数据库mysql-yum仓库

&#x1f618;作者简介&#xff1a;正在努力的99年打工人。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;动…

如何有效提升英文口语水平?这 15 个方法值得学习!

要提升英文口语水平&#xff0c;除了多说多练&#xff0c;还有很多方法可以尝试。下面&#xff0c;小编为大家整理了15个有效的方法&#xff0c;让你说英语更自信流利&#xff01; Record yourself speaking English and listen back to your pronunciation and intonation, i…

Docker:启动,停止

1.启动一个容器&#xff1a; docker run 可选参数 镜像名 [COMMAND] [ARG...] docker run -it ubuntu /bin/bash &#xff0c;启动一个使用ubuntu的docker&#xff0c;并使用/bin/bash做为dcoker中执行的命令。 其中818d5a1c32ac为容器ID 在宿主机上&#xff0c;可以通过docke…

Citespace软件基础应用

CiteSpace软件是Citation Space的简称&#xff0c;可以译为“引文空间”&#xff0c;由美国德雷赛尔大学计算机与情报学教授陈超美博士基于Java语言开发、基于引文分析理论的信息可视化软件。 它是一款分析科学文献中蕴含的潜在知识&#xff0c;并在科学计量学、数据和信息可视…

【Git原理与使用】-- 初步认识

目录 Git版本控制器的引入 版本控制器 Git安装&#xff08;已安装可以跳过&#xff09; Linux-centos Linux-ubuntu Git基本操作 创建Git本地仓库 配置 Git 认识工作区、暂存区、版本库 工作区、版本库 stage暂存区 工作区内容使用Git管理 Git版本控制器的引入 #&…

4端到端协议-4.3【实验】【计算机网络】

4端到端协议-4.3【实验】【计算机网络】 前言推荐4端到端协议4.2 TCP协议流捕获与TCP协议分析4.3 TCP连接管理实验目的实验内容及实验环境实验原理TCP连接管理的三个阶段TCP的连接建立TCP连接建立时的各状态TCP的数据传输TCP 的连接释放为什么A 必须等待 2MSL 的时间&#xff1…

京东到家机器学习平台建设

目录 前言 机器学习平台总体架构 模型训练平台 特征模型管理平台 在线模型预测服务 算法应用实践 总结和展望 1. 前言 京东到家作为行业领先的即时零售平台&#xff0c;一直把为消费者提供快捷便利高效高质量的即时零售服务作为自己的责任。到家算法团队作为支持京东到家各个…

Linux服务第一章:web基础与http协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、DNS与域名1.什么是域名&#xff1f;2.域名注册2.1阿里云域名申请流程 3.DNS解析 二、网页的概念1.网页&#xff08;HTTP/HTTPS&#xff09;的基本概念2.HTML概述…

【python】flask+pymysql 实现Web端操作数据库!

Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug &#xff0c;模板引擎则使用 Jinja2 。Flask使用 BSD 授权。 Flask也被称为 “microframework” &#xff0c;因为它使用简单的核心&#xff0c;用 extension 增加其他功能。Flask没有默认使用…

Modbus协议基于modscan 的设备数据收发过程模拟

Modbus协议基于modscan 的设备数据收发过程模拟 一、基本介绍二、工具使用说明2.1 Modsim32的使用 - 模拟从设备 - 生成设备数据2.1.1 新建虚拟设备 - modsim文件2.1.2 打开虚拟设备 - modsim文件2.1.3 连接设置2.1.3.1 modbus /tcp连接2.1.3.2 COM连接 2.1.4 配置 - 设置数据自…

python 加速(1)

文章目录 简单步骤像Python一样做torch 的一切安装Cmake安装 Torch &#xff08;GPU&#xff09;CMakeLists.txt试用小样设置 CLion 环境 Cuda配置VS C 环境建上手的文件step1: interpolation.cppstep2: interpolation_kernel.custep3: include/ utils.hstep4: setup.pystep5: …

FPGA_学习_08_有限状态机

状态机是FPGA编程必学内容之一&#xff0c;因为状态机在项目用的特别多。 那为什么状态机这么重要呢&#xff1f; 在写这篇blog之前&#xff0c;搜到CSDN一位大佬的博客&#xff0c;有一句话令我醍醐灌顶&#xff1a; “FPGA不同于CPU的一点特点就是CPU是顺序执行的&#xff0c…

操作系统页面置换算法详解(OPT算法、FIFO算法、LRU算法解释+缺页数计算)

名人说&#xff1a;一花独放不是春&#xff0c;百花齐放花满园。——《增广贤文》 作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 〇、页面置换算法是什么&#xff1f;一、OPT算法1、算法介绍2、举例二、FIFO算法1、…

【嵌入式模型转换】算能盒子SE5 芯片板子BM1684

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.环境准备2. 开发机安装环境 前言 官网文档指引&#xff1a;https://doc.sophgo.com/sdk-docs/v23.03.01/docs_latest_release/docs/SophonSDK_doc/zh/html/c…