关于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 就追不上了我
随机推荐
- 企业如何通过CRM系统使销售周期缩短
企业为什么要缩短销售周期?因为这意味着可以节约更多开支,从而达到企业利润最大化.但是有不少企业尤其是B2B行业,销售周期都在三个月以上.通过调查发现,很多企业在客户信息和销售管道上缺乏管理和策略.Zo ...
- 资源:Maven相关jar快速下载地址
Maven下载海外jar包太慢,可以进入下面地址搜索下载 下载地址:https://www.findjar.com/
- SpringBoot:SpringBoot项目的配置文件放在Jar包外加载
SpringBoot读取配置文件的优先级为: 第一.项目jar包同级下的config文件夹是优先级最高的,是在执行命令的目录下建config文件夹.(在jar包的同一目录下建config文件夹,执行命 ...
- getopt模块的学习
在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能.目前有短选项和长选项两种格式.短选项格式为"-"加上单个字母选项:长选项为"--"加 ...
- MYSQL数据库数据拆分之分库分表总结 (转)
数据存储演进思路一:单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 数据存储演进思路二:单库多表 随着用户数 ...
- 「AGC020D」 Min Max Repetition
「AGC020D」 Min Max Repetition 传送门 首先这个东西的连续字符个数你可以二分.但事实上没有必要,这是可以直接算出来的. 即 \(k=\max\{\lceil\frac{A}{ ...
- python使用笔记28--unittest单元测试框架
单元测试:开发程序的人自己测试自己的代码 unittest自动化测试框架 1.单元测试 unittest框架,执行的顺序是按照方法名的字母来排序的 setUpClass方法是最开始执行的 tearDo ...
- C++ 标准模板库(STL)——容器(Containers)的用法及理解
C++ 标准模板库(STL)中定义了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量(vector).队列(queue).栈(stack).set.map等.这次主要 ...
- 禅道项目管理软件-Linux上一键安装
一.安装 1.将安装包直接解压到/opt目录下 特别说明:不要解压到别的目录再拷贝到/opt/,因为这样会导致文件的所有者和读写权限改变,也不要解压后把整个目录777权限. 可以使用命令: tar - ...
- C语言:宏定义
#include <stdio.h> #define PI 3.14159265454454235432453245 main() { printf("%f\n",PI ...