当前位置: 首页 > news >正文

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();
    }

}
  • 第二 、编写动态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);
}
@FeignClient(name = "dynamicClient",contextId = "dynamicClient")
public interface DynamicClient extends SpringCloudDynamicApi {

}
  • 第三 、编写动态的监听 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);
        }
  • 第四、测试


@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);
    }

相关文章:

  • 数字电路和模拟电路-3二极管与三极管、基本逻辑运算
  • 机器学习——BP神经网络详细介绍及案例Python代码实现
  • 了解如何通过 UltraEdit丨UEStudio 中的窗口停靠系统显示、控制和配置文件选项卡
  • Flutter SDK 自带的 10 个最有用的 Widget
  • 计算机网络-应用层篇-HTTP协议
  • Kafka 认证二:ScramLoginModule 认证及 Java 连接测试
  • 1024程序员节主题征文 | 程序员节节日祝福语大全
  • 【DETR 论文解读】End-to-End Object Detection with Transformer
  • 分类和回归-决策树算法(ID3、C4.5和CART)
  • JSP综合测评管理系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc
  • 【微服务】如何实现微服务集群的高可靠?
  • 万字带你入门Go语言(建议收藏)
  • I2C知识大全系列一 —— I2C相关概念
  • python数学建模--线性规划问题案例及求解
  • 23、STM32——CAN
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 230. Kth Smallest Element in a BST
  • export和import的用法总结
  • Js基础——数据类型之Null和Undefined
  • LeetCode18.四数之和 JavaScript
  • node 版本过低
  • zookeeper系列(七)实战分布式命名服务
  • 初识MongoDB分片
  • 翻译--Thinking in React
  • 前端自动化解决方案
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 原生 js 实现移动端 Touch 滑动反弹
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​【已解决】npm install​卡主不动的情况
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #Spring-boot高级
  • (NSDate) 时间 (time )比较
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (学习日记)2024.01.09
  • (原創) 未来三学期想要修的课 (日記)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)EOS中账户、钱包和密钥的关系
  • (转)母版页和相对路径
  • .htaccess配置常用技巧
  • .libPaths()设置包加载目录
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net快速开发框架源码分享
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET中的十进制浮点类型,徐汇区网站设计
  • ?.的用法
  • @31省区市高考时间表来了,祝考试成功
  • @RequestBody与@ModelAttribute
  • [ 蓝桥杯Web真题 ]-布局切换
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [.NET 即时通信SignalR] 认识SignalR (一)