关于Feign、Jackson、RabbitMQ、Jrebel插件的开发中遇到的问题
在工作实际开发中需要开发一个消息模块对外提供统一的接口feign调用提供消息加载到MQ队列的服务,采用泛型的形式。
刚开始搭建好之后,正好需要做一个全局的日志添加到zuul网关中,通过网关feign MQ模块发送到队列(这个操作是异步的,不会影响主要业务流程),随后log模块需要监听这个channel。之前消息模块刚搭建起来的时候是没有问题的,但是在我写统一的日志记录的时候,发生了意外情况。
情况一:Feign请求直接进入熔断而非处理器
上午排查了2个小时feign的调用过程中也没有发生报错,*本身是GET 请求也就是意味着是URI 传参后来因为特殊类型比较多,log传参采用的 body传参,记住这个点,破案的重点。
后来尝试body去了,继续采用GET请求仍然不行 * 这是另外一个情况造成的。
情况一:
无意间把body的传参给删除了,没有方向的时候也百度不到答案只能尝试从源码中找调用的问题但是没有研究过Feign的调用过程但是知道其最终肯定也是发送Http请求进行数据的交互,于是直接在Log模块中的dispatchServlet打上断点(因为从feign的请求过来 直接进入熔断,但是传参有值说明接收到了请求),接着一步一步的走过去发现竟然走通了,进入了最终的处理器,十分的震惊多次请求不敢相信,结果都通过了。后来不知道在哪里尝试重新传参,无意间发现Jackson序列化会提前将body,我的请求数据格式:{"name":"name", "age":"20", "user":{}}会直接将user 优先转换为LinkedHashMap,导致进入传参时会数据类型转换失败。后来将接收改成了Map<String, Object> 解决了问题。
情况二:
后来想到为什么之前也尝试了GET,把body传参去除为什么收不到消息呢?甚至会存在第一次channel收到,第二次channel没有收到。于是打开rabbitmq的管理端,发现log——channel 存在2个消费者,*** 但是我清晰的知道我就采用了一个消费者进行队列的监听。** 经过重启消费者全部清空,但是没过一会又会新增几个。突发奇想我目前开发环境使用了jrebel的热部署插件不会对项目重启而是重新加载修改的class并对bean进行重新加载,因为rabbitmq默认的consumer-tag 是随机的导致没有覆盖原有的消费者,形成了负载均衡和消息不可达。
经过实践测试原因找到并解决。
关于Feign、Jackson、RabbitMQ、Jrebel插件的开发中遇到的问题的更多相关文章
- (持续更新)vs2012,2013,2015,2017,2019 常用的插件 与 开发中常用的工具
这篇博客 持续更新. 小伙伴们可以复制名称,在vs的扩展和更新中去搜索下载 .其他的工具在官网下载
- 180714、JRebel插件安装配置与破解激活(多方案)详细教程
JRebel 介绍 IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,才能生效,浪费不少生命啊.目前对于idea热部署最好的解决方案就是安装JRebel插件 ...
- JRebel插件安装配置与破解激活(多方案)详细教程
JRebel 介绍 IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,才能生效,浪费不少生命啊.目前对于idea热部署最好的解决方案就是安装JRebel插件 ...
- Android应用插件式开发解决方法
转自:http://blog.csdn.net/arui319/article/details/8109650 一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来 ...
- Android应用插件式开发解决方法[转]
一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来越多,APK安装包也越来越大,用户在使用过程中也没有办法选择性的加载自己需要的功能模块.此时可能就需要考虑如何分 ...
- 也来学学插件式开发续-利用MEF
前面一个博客:也来学学插件式开发中很多朋友留言说可以用MEF来实现.于是我就试着用MEF实现了一下. 步骤和上一篇差不多,只是加载插件的方式有所不同.这只是一个自己的示例程序,肯定有很多不足之处,欢迎 ...
- Java基础学习总结(57)——Jrebel插件热部署
JavaEE开发环境下,Tomcat对热布署的支持还是比较弱,致使开发过程中浪费大量时间在重启服务上.胖先生讨厌来来回回的折腾,所以想看看有没有实时的编译,发现Jrebel的插件付费软件,它对热布署的 ...
- 使用JRebel插件实现SpringBoot应用代码热加载
前言 在实际的开发过程中,我们经常修改代码之后,手动的重启项目,查看修改效果.那么有没有一种方式能够快速的.自动的帮我们将修改代码自动更新,避免手动重启,从而提高开发效率呢?是有的,在我之前的文章里面 ...
- 使用这些idea插件让开发效率提高5倍
idea 有很多非常好用的插件,用好了这些插件能够极大的提高开发效率 插件用的好,bug 就追不上了我
随机推荐
- 面试官:spring中定义bean的方法有哪些?我一口气说出了12种,把面试官整懵了。
前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...
- 『心善渊』Selenium3.0基础 — 18、使用Selenium操作浏览器的弹窗
目录 1.操作浏览器自带弹窗 2.操作浏览器页面自定义弹窗 1.操作浏览器自带弹窗 (1)说明: webdriver中处理JavaScript所生成的alert.confirm 以及prompt 弹窗 ...
- Redis 底层数据结构之整数集合
文章参考:<Redis 设计与实现>黄建宏 整数集合 整数集合时集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合数量不多时,就会使用整数集合 typedef struct i ...
- CentOS-Docker搭建Nacos-v1.3.2(单点)
说明:从v1.3.1版本开始支持自定义mysql-8.x 通用属性配置(v1.3.2) name description option MODE cluster模式/standalone模式 clus ...
- Vue:node.js与vue安装配置
下载node.js 官网: https://nodejs.org/zh-cn/ 查看node版本 node -v 配置淘宝NPM镜像源(下载速度快) npm install -g cnpm --reg ...
- MySql数据库缓存
对MySql查询缓存及SQL Server过程缓存的理解及总结 一.MySql的Query Cache 1.Query Cache MySQL Query Cache是用来缓存我们所执行的SELE ...
- Java实验项目二——二维数组实现九九乘法表
Program:打印乘法口诀表 (1)编写一个方法,参数(二维数组),完成将二维数组中的数据按照行列显示的工作. (2)编写一个测试方法,给出99乘法表,放入到二维数组中,调用(1)中的方法,显示乘法 ...
- 密码学系列之:memory-bound函数
密码学系列之:memory-bound函数 目录 简介 内存函数 内存受限函数 内存受限函数的使用 简介 memory-bound函数可以称为内存受限函数,它是指完成给定计算问题的时间主要取决于保存工 ...
- ESP32S2获取sht30温湿度
static const char *TAG = "i2c-temp"; static unsigned char sht30_buf[6]={0}; static float g ...
- C语言:判断整除
if (aa%10==0)来判断 不能用if (aa/10==int(aa/10)) 判断