🎀dubbo 2.7.2 启动报错【Unsupported generic type false】排查

1.问题现象
dubbo服务启动时抛出异常Unsupported generic type false,但不影响服务正常发布。
Caused by: java.lang.IllegalArgumentException: Unsupported generic type false
2. 版本信息
SpringBoot 2.1.3 + Dubbo 2.7.2
3. 问题根因
项目中使用了Spring Boot Actuator模块,Spring Boot Actuator配置独立的管理端口时会创建特殊子上下文(项目中会存在两个上下文实例),导致dubbo对spring上下文刷新事件监控触发两次;
同时开启了dubbo延迟发布(dubbo.provider.delay=3000),由于dubbo 2.7.2中的BUG,两次均会进行了export动作;
同时由于dubbo 2.7.2版本中对generic的判断问题而在第二次export时抛出异常。
4.分析过程
由
message中可以看出:Unsupported generic type false是dubbo泛化调用配置错误告警


4.1. 检查配置是否有误
检查全局中dubbo配置是否存在generic="false"
<dubbo:service generic="false" />
经过检查,项目中无该问题配置
4.2. 堆栈分析
通过检查未发现人为错误配置,进一步分析异常堆栈
具体堆栈如下:
level: ERRORthreadName: mainclassName: o.a.d.c.AbstractConfig - [DUBBO] Failed to override , dubbo version: 2.7.2, current host: xxx.xxx.xxx.xxx
java.lang.reflect.InvocationTargetException: null
at sun.reflect.GeneratedMethodAccessor864.invoke(Unknown Source) ~[?:?]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_412]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_412]
at org.apache.dubbo.config.AbstractConfig.refresh(AbstractConfig.java:567) ~[dubbo-2.7.2.jar!/:2.7.2]
at org.apache.dubbo.config.ServiceConfig.checkAndUpdateSubConfigs(ServiceConfig.java:304) ~[dubbo-2.7.2.jar!/:2.7.2]
at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:369) ~[dubbo-2.7.2.jar!/:2.7.2]
at org.apache.dubbo.config.spring.ServiceBean.export(ServiceBean.java:336) ~[dubbo-2.7.2.jar!/:2.7.2]
at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:114) ~[dubbo-2.7.2.jar!/:2.7.2]
at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:60) ~[dubbo-2.7.2.jar!/:2.7.2]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:896) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:163) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552) ~[spring-context-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
at com.xxx.xxx.xxx.xxx.xxxApiStartUp.main(xxxApiStartUp.java:26) ~[classes!/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_412]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_412]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_412]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_412]
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[xxx.jar:?]
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[xxx.jar:?]
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) ~[xxx.jar:?]
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) ~[xxx.jar:?]
Caused by: java.lang.IllegalArgumentException: Unsupported generic type false
at org.apache.dubbo.config.ServiceConfig.setGeneric(ServiceConfig.java:1015) ~[dubbo-2.7.2.jar!/:2.7.2]
从堆栈上可以看出在ServiceBean这里有对spring事件的监控
查看源码如下:

可以看出dubbo是在spring ApplicationContext 上下文刷新时进行了发布动作export
这里引起思考:为什么实际dubbo服务没有发布失败了?
4.3. 官方issues
前往github检索官方可发现有相同的issues
https://github.com/apache/dubbo/issues/3629

4.4. 源码分析
为什么export两次ServiceConfig会有问题了?
再回到dubbo源码,可以发现在export中有对generic赋默认值false的动作;
在第一次refresh后进行赋值,在第二次refresh时由于generic="false"报错

然而这里并没有结束
在前面duubo serviceBean 对spring上下文刷新事件的监控源码中可以看到,dubbo有对重复发布的屏蔽处理动作

那为什么还能发布两次了?
继续看该发布属性的更新可知,是在serviceConfig doExport之后更新

往上寻找调用栈可以发现:在dubbo export时有两种发布模式:直接发布、延迟发布

看过dubbo源码的同学可以看出,直接发布模式下,应该会被发布属性拦截

可以看出异步发布模式下,第一次异步发布后,第二次上下文刷新事件监控进入时发布属性会无法拦截

前往配置中心也可以看到有相关延迟发布的配置
dubbo.provider.delay=3000
到这里我们取消了延迟发布后,重启后不再报错。
虽然表象问题解决,但根本原因是为什么会触发两次发布动作了?
看源码这里是对spring ApplicationContext上下文刷新事件的监控,触发两次说明有两个个上下文实例。
可以写个工具检测输出下:
@Component
public class ContextRefreshCounter implements ApplicationListener<ContextRefreshedEvent> {
private static int count = 0;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("Context refreshed, total times: " + ++count);
System.out.println("ApplicationContext instance: " + System.identityHashCode(event.getApplicationContext()));
System.out.println("ApplicationContext id: " + event.getApplicationContext().getId());
}
}

看到有两个上下文:application、application:management


application是根上下文
application:management是Spring Boot Actuator管理端点的子上下文
查看配置中心,发现有配置独立的管理端口
management.server.port=8081
由此可知由于引入了Spring Boot Actuator且配置了独立的管理端口,导致生成多个上下文实例,从而触发了多次spring上下文刷新事件的监控。
5. 官方修复
后续版本官方已针对generic值的判断以及dubbo服务发布逻辑进行了优化,具体可前往github官网查看。
https://github.com/apache/dubbo
结束
🎀dubbo 2.7.2 启动报错【Unsupported generic type false】排查的更多相关文章
- 启动报错 Unsupported major.minor version 51.0
Unsupported major.minor version 51.0错误, 是使用jdk6启动jdk7编译的项目,更换jdk7就好了,或者用jdk6重新打包项目. 解决起来也很方便:打开excli ...
- java 启动报错 Unsupported major.minor version 52.
这是java 版本问题,主要是版本不统一,你看看你开发工具用的java版本(编译的java版本和开发的java版本)是否统一,如果没有统一就会报这个错误.
- jetty启动报错Unsupported major.minor version 51.0
主要是JDK版本的问题,需要将Eclipse的Jdk版本设置为1.7的才可以,编译级别也设置为1.7,然后删除maven项目路径,D:\WORK\workspace\xxx\target下的所有文件, ...
- Linux下Tomcat项目启动报错
Linux下Tomcat项目启动报错 org.springframework.beans.factory.CannotLoadBeanClassException: Error loading cla ...
- docker启动报错iptables failed: -重建docker0网络恢复
# docker启动报错 [root@localhost mysqlconf]# docker run -d -p 8080:8080 --link zookeeper:zookeeper -e du ...
- hbase shell 启动报错
启动hbase之后,发现hbase shell启动报错: version 2.0.0-alpha4, r5c4b985f89c99cc8b0f8515a4097c811a0848835, Tue Oc ...
- Tomcat启动报错org.springframework.web.context.ContextLoaderListener类配置错误——SHH框架
SHH框架工程,Tomcat启动报错org.springframework.web.context.ContextLoaderListener类配置错误 1.查看配置文件web.xml中是否配置.or ...
- 【原】tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()Ljavax/servlet/SessionCookieConfig的解决
现象: tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig() ...
- Oracle启动报错ORA-03113解决
环境:RHEL6.4 + Oracle 11.2.0.4 步骤摘要:1.启动报错ORA-031132.查看alert日志查找原因3.根据实际情况采取合理的措施,这里我们先增加闪回区大小,把库启动起来4 ...
- Oracle启动报错ORA-27102解决
环境:RHEL5.5 + Oracle 10.2.0.4 此错误一般是因为数据库的初始化参数文件的内存设置不当导致.本例是因为操作系统参数设置问题导致. 当前现象:Oracle启动报错ORA-2710 ...
随机推荐
- 面试题:关于StringBuffer()源码的深度理解Debug分析
import org.junit.Test; /** * @author CH * @create 2021 上午 11:23 */ public class IDEADebug { @Test pu ...
- AI时代云动力:新一代弹性计算云主机开启智能计算新纪元!
随着信息技术的飞速发展,云计算在企业数字化转型中发挥着愈发重要的作用. 弹性计算作为云计算技术的重要组成部分,以灵活的资源分配.高可用性等优势,在数字化转型中扮演着举足轻重的角色. 为打造更加卓越的上 ...
- 第一!天翼云荣获国际人工智能顶会AAAI 2024大模型数学理解&推理竞赛冠军!
近日,AAAI 2024 Global Competition on Math Problem Solving and Reasoning大赛落下帷幕,天翼云智能边缘事业部AI团队凭借在大模型基础能力 ...
- changeIP.sh一键切换本机ip脚本
changeIP.sh vi changeIP.sh chmod +x changeIP.sh #!/bin/bash export IFCFG=/etc/sysconfig/network-scri ...
- CF607B Zuma 题解
CF607B Zuma 不知道为什么你谷会评蓝,这不是很基础的区间DP吗. Problem - 607B - Codeforces 题意简述 消除回文子串的最小次数. 思路 对于区间\([i,j]\) ...
- mongo数据库CPU使用率飙高及优化
出现的情况 某天高高兴兴上班,发现一台mongo数据库负载较高,达到了300多,且一直很稳定,难道是硬件过时了. 检查主机的资源使用发现一个mongod进程使用了几乎所有的CPU资源. top - 1 ...
- 安川机器人HW1171766-A本体线缆维修详解
随着工业自动化程度的不断提高,安川机器人在生产线上的应用越来越广泛.然而,在长期运行过程中,安川机器人本体线缆可能会出现磨损.老化.断裂问题,这些问题不仅会影响机器人的正常运行,还可能导致生产线的停滞 ...
- Deepseek学习随笔(7)--- 构建私人知识库(附网盘链接)
Step 1:创建知识库 入口定位 登录 DeepSeek 控制台 → 左侧导航栏点击「知识库」→ 点击「新建知识库」按钮 基础设置 知识库名称:建议使用「领域+用途」命名法,如「医疗-糖尿病文献库」 ...
- yarn的安装与配置(秒懂yarn用法)
安装和配置Yarn可以通过以下步骤完成: 安装Node.js:首先,确保已经安装了Node.js.可以通过在终端中运行node -v来检查是否已安装.如果没有安装,可以从Node.js官方网站(htt ...
- HTTP - [01] 简介
HTTP本身是不安全的,因为传输的数据未经加密,可能会被窃听或篡改.为了解决这个问题,引入了HTTPS,即在HTTP上加入SSL/TLS协议,为数据传输提供了加密和身份验证. 一.概述 HTTP( ...