码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Flowable监听器动态调用Springcloud接口


    由于今年接到一个大的项目,食品安全全链路追溯项目,流程就很少发博客了,但是我还一直坚持到一线,不停的完善流程的项目。

    在很多场景中,我们都需要在监听器中去动态调用业务接口,如果企业内部使用的微服务,nacos,我们又当怎么去动态调用接口呢

    通过配置就能很好的调用Nacos的接口

    • 目标:只需要配置,不需要硬编码来调用接口
    • 第一 、编写动态client工厂类 DynamicFeignClientFactory
    • 第二 、编写动态client类 SpringCloudDynamicApi 和 DynamicClient
    • 第三 、编写动态的监听 TaskBusinessCallListener
    • 第四、测试

    目标:只需要配置,不需要硬编码来调用接口

    1. 动态配置调用

    • 第一 、编写动态client工厂类 DynamicFeignClientFactory

    @Component
    public class DynamicFeignClientFactory<T> {
    
        private FeignClientBuilder feignClientBuilder;
    
        public DynamicFeignClientFactory(ApplicationContext appContext) {
            this.feignClientBuilder = new FeignClientBuilder(appContext);
        }
    
        public T getFeignClient(final Class<T> type, String serviceId,String path) {
            return this.feignClientBuilder.forType(type, serviceId).path(path).build();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 第二 、编写动态client类 SpringCloudDynamicApi 和 DynamicClient

    public interface SpringCloudDynamicApi {
        @PostMapping(value = "", produces = "application/json")
        JSONObject postExecute(@RequestBody Map<String,String> params);
    
        @GetMapping(value = "", produces = "application/json")
        JSONObject getExecute(@RequestBody  Map<String,String> params);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    @FeignClient(name = "dynamicClient",contextId = "dynamicClient")
    public interface DynamicClient extends SpringCloudDynamicApi {
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 第三 、编写动态的监听 TaskBusinessCallListener

    @Component(value = "taskBusinessCallListener")
    public class TaskBusinessCallListener implements TaskListener {
        /**
         * nacos的服务id
         */
        private FixedValue serviceId;
        /**
         * 访问的url路径
         */
        private FixedValue url;
        /**
         * 参数 多个的话用分号隔开 实例 userCode:00004737;status:1
         */
        private FixedValue params;
        @Autowired
        private RuntimeService runtimeService;
        @Autowired
        private DynamicFeignClientFactory<DynamicClient> dynamicFeignClientFactory;
    
        @Override
        public void notify(DelegateTask delegateTask) {
            String processInstanceId = delegateTask.getProcessInstanceId();
            ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
            String businessKey = processInstance.getBusinessKey();
            String serviceIdStr = null, urlStr = null, paramsStr = null;
            if (serviceId != null) {
                serviceIdStr = serviceId.getExpressionText();
            }
            if (url != null) {
                urlStr = url.getExpressionText();
            }
            if (params != null) {
                paramsStr = params.getExpressionText();
            }
            DynamicClient dynamicClient = dynamicFeignClientFactory.getFeignClient(DynamicClient.class, serviceIdStr, urlStr);
            Map<String, String> params = new HashMap<>();
            params.put("processInstanceId", processInstanceId);
            params.put("businessKey", businessKey);
            params.put("params", paramsStr);
            dynamicClient.postExecute(params);
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 第四、测试

    
    @SpringBootTest(classes = HopeFlowServerApplication.class)
    public class TestClient {
    
        @Autowired
        private DynamicFeignClientFactory<DynamicClient> feignClientFactory;
    
        @Test
        public void testDynamic() {
            DynamicClient dynamicClient = feignClientFactory.getFeignClient(DynamicClient.class, "flow-center", "/api/flow/base/getApps");
            Map<String,String> params = new HashMap<>();
            JSONObject object = dynamicClient.postExecute(params);
            System.out.println(object);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    代码随想录 | Day 59 - LeetCode 503. 下一个更大元素II、LeetCode 42. 接雨水
    优雅而酷炫的自定义CSS滚动条:展示
    java基于springboot+vue的学生考勤请假打卡管理系统 elementui
    c语言练习89:链表的使用
    Java的数据类型
    你不知道的SQL语言数据库原理
    Android基础第八天 | 字节跳动第四届青训营笔记
    openGauss学习笔记-124 openGauss 数据库管理-设置账本数据库-查看账本历史操作记录
    MyBatisPlus(十八)字段类型处理器:对象存为JSON字符串
    Spark 3.0 - 7.LR 多分类实现影评预测电影评分与指标评测
  • 原文地址:https://blog.csdn.net/liuwenjun05101/article/details/127445589
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号