我人都傻了,CompletableFuture和OpenFegin一起使用竟然报错

Could not find class [org.springframework.boot.autoconfigure.condition.OnPropertyCondition] java.lang.IllegalArgumentException: Could not find class [org.springframework.boot.autoconfigure.condition.OnPropertyCondition] 阅读详情

起因

在一个迭代的需求中,需要记录用户的行为,想着记录用户行为这部分业务逻辑可以修改为异步执行,就使用了CompletableFuture的runAsync()方法实现异步,本来本地环境自己测试也没报错,可是发到开发环境服务器上的时候却报错了。

报错伪代码

 CompletableFuture.runAsync(()->{
            //掉用user服务保存用户行为
            userClient.saveUserBehavior();
 });

错误信息以及使用的环境

环境:jdk使用的是openjdk11,SpringCloud版本是2020.0.3

java.lang.ClassNotFoundException: org.springframework.boot.autoconfigure.condition.OnPropertyCondition

问题排除过程

因为本地环境是没有报错的,但是开发环境却报错了,所以一开始检查代码时候没有合并,是否没有将代码提交到开发环境。但是重新检查之后,发现代码是已经合并并且提交到开发分支。随后开始分析报错原因,看到这个错误的时候,相信大家和我一样第一反应会认为是Jar包冲突了,但是在仔细检查依赖的Spring的版本,发现Spring的版本也并没有冲突。想着难道是我改的代码改出问题了?我慌了,我也只是把代码修改成了异步啊,于是乎将代码改回同步,果然就没有问题了。

尝试寻找产生问题的原因

虽然问题解决了,但是我是一个有着好奇心的程序员,为什么在CompletableFuture掉用Fegin接口会报错,是什么原因导致的?带着这样的疑问,我开始在GitHub上逛了起来。心想这样使用的人应该不止我一个吧,所以应该也有不少同学也遇到了这样的问题吧。果然github没有让我失望,上面真的有我想要的东西。(所以程序员要多在Github上摸鱼)

github.com/spring-clou…

在这个issues中,我找到了答案,issues的提交者和我遇到的问题一样,甚至连报错信息都那么的像,我顿时心里乐开了花。总的来说就是Fegin接口是懒加载的,只有在我们第一次使用该Fegin接口的时候才会对Fegin接口进行初始化,但是如果在ForkJoinWorkerThread中使用Fegin接口的话,就会出现ClassNotFoundException。使用其他普通的JVM线程池是不会出现问题的。

接下来我们看下Spring Cloud团队对于这个问题的回答

Spring Cloud团队的人给出的回答是这样的:

大概说的就是在并行流(多线程)中调用 FeignBlockingLoadBalancerClient时会出现 ClassNotFoundException。

但是经过在本地测试,只有在使用ForkJoinPool线程池中调用Fegin接口才会报错,如果我们在ThreadPoolExecutor自定义线程池或者使用jdk提供的线程池(例如FixedThreadPool)中调用Fegin接口是不会报错的,而恰巧CompletableFuture中的默认线程池也是通过ForkJoinPool线程池来实现的。难道真的有这么巧吗?这两位开发者证实了在ForkJoinPool中使用Fegin接口会出现这个错误,但是其他JVM线程池是可以正常运行的。

那为什么在本地环境测试没有问题,但是发布到dev环境却出现了问题呢?

带着这个疑问我检查了开发环境与本地环境的差异,发现本地环境使用的JDk版本是11,但是dev环境使用的JDK是Openjdk11。随后我在本地替换jdk的版本为openJdk,在本地进行进一步测试。

果然代码再次报错。

 java.lang.ClassNotFoundException: org.springframework.boot.autoconfigure.condition.OnPropertyCondition
      at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source) ~[na:na]
      at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source) ~[na:na]
      at java.base/java.lang.ClassLoader.loadClass(Unknown Source) ~[na:na]
      at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
      at java.base/java.lang.Class.forName(Unknown Source) ~[na:na]

那么这个问题Spring Cloud团队解决了吗?

很遗憾,并没有解决。Spring Cloud团队认为这个问题的优先级并不高,并且不推荐在CompletableFuture中调用Fegin接口,还表示如果社区有人愿意为这个问题提交代码,Spring Cloud团队也会认真审核代码,如果通过的话也会合并代码。

好吧,那看来我只能使用自定义TreadPool来实现异步了(当然也可以使用mq)。

总结

只有在openJDK11版本下才会出现这个问题(回家后我也试过JDK8,并不会出现异常),并且如果在ForkJoinPool中调用Fegin接口,那么就会出现ClassNotFoundException。因为Spring Cloud团队认为这个问题的优先级不高,并没有解决这个问题。虽然CompletableFuture真的很好用,但是如果你需要在CompletableFuture中调用Fegin接口,那么建议定义一个自定义的线程池,不要使用默认的ForkJoinPool.

使用下面这样的api,CompletableFuture就会使用我们传入的线程池去执行任务。

public static CompletableFuture<Void> runAsync(Runnable runnable,
                                                   Executor executor) {
        return asyncRunStage(screenExecutor(executor), runnable);
    }

所以小伙伴们如果需要异步调用Fegin接口,还需要多加注意呀,避免踩坑。

关于springboot项目的一下常见的错误及解决办法 项目的依赖搞死人呀!!! 阅读详情

相关推荐

SpringCloud学习 - Feign远程调用丢失请求头问题的解决 使用Feign+CompletableFuture 异步调用丢失请求头的问题

SpringCloud学习 Feign远程调用 异步调用CompletableFuture 丢失请求头问题的解决 1.使用Feign进行远程调用丢失请求头问题 当使用Feign进行远程调用时,Feign会自动构造一个新的http请求再发送.因此会默认丢掉原请求的请求头信息.导致一些重要的数据丢失(Cookie) 解决方法: 添加Feign远程调用拦截器,在拦截器中进行请求头信息的同步. 原理:Feign在构造http远程调用请求时,会检查是否有添加拦截器RequestInterceptor(默认没有),

NeverGiveUp 3489

ClassNotFoundException: org.springframework.boot.autoconfigure.condition.OnPropertyCondition

.ClassNotFoundException: org.springframework.boot.autoconfigure.condition.OnPropertyCondition

一世为白 4969

区块链入门:用账本、乐高和三台旧电脑讲懂分布式账本

区块链是一种去中心化的分布式账本技术,其核心原理是通过密码学哈希、共识机制和链式结构实现数据不可篡改与多方共同验证。它不依赖单一中心,而是将交易记录同步复制到多个节点,依靠数学规则而非人工信任达成一致,从而在数字世界构建可验证的信用基础设施。这种‘集体见证’模式显著提升了系统抗单点故障与人为干预的能力,广泛应用于供应链溯源、数字身份、教育管理及公益透明等需强信任保障的场景。本文以账本类比、乐高拆解和Ganache实操为线索,面向零基础读者通俗解析哈希值、挖矿与智能合约等关键概念。

weixin_30517215的博客 276

Spring Cloud 疑难杂症之 CompletableFuture 与 Openfeign 一起使用的问题

官方认为此bug优先级并不高,官方不会花精力解决;但是对社区是开放的,社区开发者可以提PR。这个问题其实由来已久,Spring Cloud 官方对其已有。目前有开发者提出了一些折衷的解决方案。

冰糖的博客 1868

曙光服务器RAID配置避坑指南:MegaRAID SAS 9361-8i实战(含Foreign状态处理)

本文详细解析了曙光服务器搭配MegaRAID SAS 9361-8i控制器的RAID配置全流程,包括RAID0和RAID5的创建、Foreign状态处理及性能优化策略。特别针对磁盘迁移中的Foreign状态问题,提供了系统化的解决方案和高级恢复技巧,助力企业级IT运维提升存储配置的稳定性和可靠性。

weixin_29200741的博客 415

ESP8266入门(一)固件烧录及常见问题分析

为了实现对数据的远程收集和分析,偶然间发现了esp8266这个模块,对此进行了深入的学习,可是在学习之初遇到了大量的问题,这个系列文章就为大家讲讲我遇到的坑以及解决办法,还有esp8266如何连上oneNet云平台的方法。因为我用的是esp8266nodemcu,可以直接连接usb进行烧录,如果用模块的话接线就比较麻烦,可以去搜搜看.

Jerryxuzherui的博客 8956

在CompletableFuture.runAsync()中使用 openFeign进行远程调用时报错

注意:若出现这个问题,则必须配置自定义线程池!

ohengs的博客 900

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 116

Feign项目报错汇总

近日,在项目中使用到了Feign项目,却出现各种问题,于是将遇到的错误写下来,希望能帮到你。 spring boot版本为1.5.9 ,cloud版本也不高。 接口无法注入: 遇到这种情况的原因可能是 注解加的不对,或者接口中参数的获取没有绑定具体参数(巨坑)。 接下来详细的说收怎么回事。 先从主启动类开始找:主启动类上是不是加入了@EnableFeignCl......

zhao 3746

AI原生SaaS应用的自动化运维体系构建

随着ChatGPT掀起的AI原生应用浪潮,越来越多SaaS(软件即服务)产品开始以"AI优先"的方式设计——从用户交互到核心功能,都深度依赖机器学习模型(如推荐算法、智能客服)、实时数据流(如用户行为分析)和弹性算力(如大模型推理)。这类应用的运维需求与传统SaaS完全不同:传统运维像"修水管",哪里漏了补哪里;AI原生运维则像"照顾会成长的宠物",需要实时感知模型状态、数据变化和流量波动,主动调整资源。

AI天才研究院 1080

猫群优化算法(CSO)详解:从生物灵感到智能优化

猫群优化算法(CSO)是一种模拟猫科动物行为的群体智能优化算法。该算法基于猫的两种主要行为模式:搜寻状态(全局探索)和跟踪状态(局部开发)。CSO通过混合率(MR)动态调整两种模式的比例,实现探索与开发的平衡。算法核心包括搜寻模式的变异操作和跟踪模式的速度-位移模型,具有收敛性能好、全局搜索能力强等特点。相比传统优化算法,CSO在高维复杂问题中表现优异,已成功应用于函数优化、图像处理等多个领域。算法性能受混合率、变化域等参数影响,自适应参数策略可进一步提升优化效果。

qq_42212808的博客 620

ClassNotFoundException: org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata

异常详情如下 Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud.context.properties.ConfigurationPropertiesBeans] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2] at org.springframework.util.Reflection

kuyuyingzi的专栏 1万+

华为用自研的MetaERP替换全球顶级的SAP ERP系统,其难度与风险远超一次普通的技术升级,它是一场战略级的、涉及业务筋骨的系统性工程

华为成功用自研MetaERP替换SAP系统,这是一项极具挑战的战略工程。面临四大难度:业务复杂度高(170多国业务)、数据迁移量大(20年历史数据)、技术集成复杂(重构生态系统)、人员适应周期长。同时伴随四大风险:业务中断、数据失真、成本超支、供应链协同问题。华为成功的关键在于:生存压力驱动的战略决心、强大的软件研发能力、以自身业务为试验场、分步实施策略。这一案例证明中国企业能攻克高端软件壁垒,但对大多数企业而言,核心系统替换需谨慎评估风险,建议采用渐进式替代策略。

金牌架构师 535

java.lang.ClassNotFoundException: org.springframework.boot.context.properties.ConfigurationBeanFacto

【代码】java.lang.ClassNotFoundException: org.springframework.boot.context.properties.ConfigurationBeanFacto。

weixin_58094032的博客 9308

eDP V1.4协议介绍

eDP的全称是Embedded DisplayPort嵌入式显示端口,主要应用与短距离系统内应用,例如手机、一体式台式机等。eDP V1.4b是基于DP V1.3标准制作完成,但因应用场景的不同,还是有很多区别。电压摆幅不同,eDP相对较低;eDP功耗相对较低;DP有线材和连接器的要求,eDP没有明确要求;AUX通道电路设计不同(相对DP取消了AC耦合电容和100KΩ/1MΩ的上下拉电阻):典型应用场景;

qflook的博客 4305

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

解决微服务调用异常feign.FeignException$NotFound: status 404 reading MysqlRemoteService#saveProjectVORemote(

Springcloud报错 feign.FeignExceptionKaTeX parse error: Expected 'EOF', got '#' at position 48: …qlRemoteService#̲saveProjectVORe…Default.decode(ErrorDecoder.java:93) ~[feign-core-10.2.3.jar:na] at feign...

北暖的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringCloud使用Feign出现java.lang.ClassNotFoundException: org.springframework.cloud.client.loadbalancer....

废话不多说!!! 在SpringCloud项目中配置了Feign来调用restful接口,项目启动的时候报错,报错信息如下: 找不到org.springframework.cloud.client.loadbalancer.LoadBalancedRetryFactory,我在IDE中全局搜索了一下,确实找不到这个类。 我用的SpringBoot版本是2.0.0.M3,Spr...

antiling9663的博客 2226

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

异步请求时,主线程结束请求被销毁,调用feign接口失败

异步操作时,因主线程结束,请求被销毁,调用feign接口而导致的几个问题。经过查找网上的资料,发现这个问题也出现在定时任务调用feign上。

qq_57421460的博客 2600

多线程并发调用feign,outcome返回NullPointerException

遇到的问题 看过我之前的文章能发现我从小就有一个并发梦,并且也是对线程协程纤程异步以及并发包有一些了解。这次的接口正好需要多次查询,并发调用feign请求提上日程。 List<Future<CurveLineDataVO>> futureList = Lists.newArrayList(); for (CurveDTO curveDTO : curveDTOList) { RequestContextHolder.setRequestAttributes(RequestConte

xzc的博客 3295

Spring cloud多模块开发下Feign的使用,以及@FeignClient注入bean找不到异常解决

然后确定这两个服务引用的Spring Cloud和Spring Boot版本是否一致,有时因为不一致,在 第一个服务中注解可能引用的是org.springframework.cloud.netflix.feign.FeignClient这个包下的,另一个服务中引用的是org.springframework.cloud.openfeign.FeignClient包下的,这时也会包这个错误,例如提供一个**/product/listForOrder****,**这个服务会在下面的订单类中调用。

web13765607643的博客 2071

Feign远程调用丢失请求头解决方案

Feign远程调用丢失请求头如何解决

weixin_45673033的博客 1070

解决异步调用fegin报空指针异常的问题

产生错误的代码段: CompletableFuture<Void> addressFuture1 = CompletableFuture.runAsync(() -> { //处理国籍信息 dealNationality(tbProfessionPageInfo.getList()); }, executor); 由于dealNationality方法通过fegin调用基础信息服务模块,但是因为加了异步之后产生了空指针异常

zhiyikeji的博客 4119

unknown source java_Java程序运行时出现Unknown Source,该怎么解决啊?

java.lang.ClassNotFoundException:com.mysql.aa.Driveratjava.base/jdk.internal.loader.BuiltinClassLoader.loadClass(UnknownSource)atjava.base/jdk.internal.loader.ClassLoader...java.lang.ClassNotFoundExce...

weixin_35662493的博客 4112

openfeign调用报cloud not find class OnPropertyCondition

改成restTemplate调用不报错,另外一个接口还是openfeign,第二天来不报错了 搞不懂。openfeign调用失败。

m0_46546969的博客 608
上一篇: Tomcat Servlet内存马
下一篇: SpringCloud阿里云实现OSS
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值