单元测试Spring 上下文加载过程中遇到的阻塞或死锁问题

news2024/11/25 12:43:31

IDEA单元测试一直转圈,阻塞,前置后置的方法都不执行,无任何输出 

1.单元测试类

@SpringBootTest(classes = {BareMetalApplication.class})
@RunWith(SpringRunner.class)
public class K8sUserNfsStoreInitServiceImplTest {

    @BeforeEach
    public void setUp() throws Exception {
        System.out.println("------------开始--------");
    }

    @AfterEach
    public void tearDown() throws Exception {
        System.out.println("------------结束--------");
    }

    @Test
    public void userJuicefsStoreDeductionScheduleEndpoint() {
        System.out.println("------------执行--------");
    }
}

2.运行状态

2.1.无@RunWith注解和@SpringBootTest注解

正常执行,日志打印正常

2.2.有@RunWith注解和@SpringBootTest注解

单元测试启动,项目正常启动,定时任务,kafka正常执行,正常应该执行before>test>after并打印日志开始,结束,执行日志,但是一直转圈卡着不动。

 (ps:已经解决了我这里无法复现,随便找了个转圈的图)

3.使用JConsole工具分析线程堆栈

1)怀疑是定时任务,kafka造成的阻塞,一一关闭不管用

2)怀疑数据库死锁,排查无死锁

3)怀疑线程阻塞

只要有runwith和springboottest两个注解就无法加载。但是可以正常启动,卡在了启动后的一些执行上,线程阻塞或死锁可能性很大。

分析 JVM 中的线程状态,找出哪些线程阻塞或死锁。

例如jstack、jconsole、VisualVM等来检测是否存在阻塞或死锁情况。

3.1.打开终端,输入JConsole命令

 3.2.回车后弹出java见识和管理控制台

 页面如下图所示,选择本地连接,从列表中找到你的测试类,然后点击连接

 选择“线程”,查看main下的对栈信息,发现有阻塞。

 3.3.堆栈跟踪

名称: main
状态: java.util.concurrent.Semaphore$NonfairSync@7610436f上的TIMED_WAITING
总阻止数: 469, 总等待数: 163

堆栈跟踪: 
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037)
java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328)
java.util.concurrent.Semaphore.tryAcquire(Semaphore.java:409)
org.redisson.RedissonLock.lock(RedissonLock.java:121)
org.redisson.RedissonLock.lock(RedissonLock.java:69)
com.ly.baremetal.service.UserBareMetalInitService.safeUserBareMetalInitsMap(UserBareMetalInitService.java:88)
com.ly.baremetal.service.UserBareMetalInitService.handleReadyEvent(UserBareMetalInitService.java:167)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:789)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)
com.ly.baremetal.service.UserBareMetalInitService$$EnhancerBySpringCGLIB$$c21d5b50.handleReadyEvent(<generated>)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:344)
org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:229)
org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:166)

这个堆栈跟踪显示了一个复杂的测试执行流程,涉及到多个层次的测试框架和引擎。关键点在于:

  • 测试启动时可能由于多个因素导致线程阻塞,主要集中在 RedissonLock 的锁等待和获取过程中。
  • Semaphore$NonfairSync TIMED_WAITING 状态表明某些线程在等待锁的许可证。 

从堆栈跟踪来看,确实显示了 UserBareMetalInitService.handleReadyEvent 方法在执行时出现了阻塞。具体原因可能是该方法内部的某些操作导致了阻塞,最终导致 SemaphoreTIMED_WAITING 状态。

可能的原因包括:

  1. RedissonLock的使用UserBareMetalInitService 中的 RedissonLock 被用于同步操作,可能在获取锁时发生了阻塞。

  2. 资源竞争:如果多个线程或服务同时竞争相同的资源,例如数据库连接或外部服务调用,也可能导致阻塞。

  3. 性能问题:某些操作可能耗时较长,例如复杂的计算、IO 操作或网络请求,这些都可能导致方法执行时间较长。

 阻塞代码所在行:

com.ly.baremetal.service.UserBareMetalInitService.safeUserBareMetalInitsMap(UserBareMetalInitService.java:88)
com.ly.baremetal.service.UserBareMetalInitService.handleReadyEvent(UserBareMetalInitService.java:167) 

3.4.代码定位

 3.5.分布式锁无法释放

3.6.手动释放锁

redis中删除问题key后重新执行,三个方法都打印了,最后也正常关闭了

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1898105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用 SwiftUI 构建 visionOS 应用

文章目录 前言WindowsVolumes沉浸式空间结论 前言 Apple Vision Pro 即将推出&#xff0c;现在是看看 SwiftUI API 的完美时机&#xff0c;这使我们能够将我们的应用程序适应 visionOS 提供的沉浸式世界。苹果表示&#xff0c;构建应用程序的最佳方式是使用 Swift 和 SwiftUI。…

【C++】 解决 C++ 语言报错:Undefined Reference

文章目录 引言 未定义引用&#xff08;Undefined Reference&#xff09;是 C 编程中常见的错误之一&#xff0c;通常在链接阶段出现。当编译器无法找到函数或变量的定义时&#xff0c;就会引发未定义引用错误。这种错误会阻止生成可执行文件&#xff0c;影响程序的正常构建。本…

气压传感器在自动驾驶汽车还有哪些应用场景

气压传感器在近年来被广泛应用于各种新兴领域&#xff0c;以下是其中几个最新的应用&#xff1a; 1、自动驾驶汽车&#xff1a;自动驾驶汽车需要精确的气压传感器来监测道路上的气压变化&#xff0c;帮助车辆进行准确的定位和导航。气压传感器可以提供高精度、可靠的气压数据&…

2.ast快速脚本熟悉ast类型-cnblog

观察ast ast更换结果使a3 // 引入Node.js的文件系统模块&#xff0c;用于读写文件 const fs require(fs); const types require("babel/types") // 引入babel/parser模块&#xff0c;用于将源代码转换成AST&#xff08;抽象语法树&#xff09; const parser requ…

【东奥会计-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

存算一体架构或成为AI处理器技术发展关键

©作者|坚果 来源|神州问学 引言 马斯克巨资60亿美元打造的“超级算力工场”&#xff0c;通过串联10万块顶级NVIDIA H100 GPU&#xff0c;不仅震撼了AI和半导体行业&#xff0c;促使英伟达股价应声上涨6%&#xff0c;还强烈暗示了AI大模型及芯片需求的急剧膨胀。这一行动…

【信息学奥赛】CSP-J/S初赛07 排序算法及其他算法在初赛中的考察

本专栏&#x1f449;CSP-J/S初赛内容主要讲解信息学奥赛的初赛内容&#xff0c;包含计算机基础、初赛常考的C程序和算法以及数据结构&#xff0c;并收集了近年真题以作参考。 如果你想参加信息学奥赛&#xff0c;但之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#…

研0学习Python基础4

1.数组是一种存储大量同性质数据的连续内存空间&#xff0c;只要使用相同的变量名称&#xff0c;便可以连续访问 每一组数据。由于数组元素的便利性&#xff0c;使得大多数程序中都可以看到数组的身影。数组是一 个带有多个数据且模式相同的元素集合。比如&#xff0c;数值所…

cmake编译源码教程(一)

1、介绍 本次博客介绍使用cmake编译平面点云分割的源代码,其对室内点云以及TLS点云中平面结构进行分割,分割效果如下: 2、编译过程 2.1 源代码下载 首先,下载源代码,如下所示,在该文件夹下新建一个build文件夹,用于后续生成sln工程。 同时,由于该库依赖open…

【基于R语言群体遗传学】-6-表型计算等位基因频率、最大似然估计方法

到目前为止&#xff0c;我们主要讨论了等位基因和基因型频率&#xff0c;以及我们如何可以从一个推断出另一个。但是&#xff0c;如果我们不知道等位基因频率&#xff0c;只知道种群中存在哪些表型呢&#xff1f;如果我们足够幸运&#xff0c;知道哪些表型对应哪些基因型&#…

散度的可视化

散度的可视化 flyfish 向量场和散度 假设我们有一个简单的向量场&#xff1a; F ( x , y , z ) \mathbf{F} (x, y, z) F(x,y,z)在这里&#xff0c;向量场 F \mathbf{F} F 是由三个分量组成的向量&#xff0c;每个分量是空间坐标 x x x、 y y y、 z z z 的函数&#xff…

详细的讲解一下网络变压器应用POE ,AT BT AF BF的概念,做电路连接指导分析

网络变压器在应用POE&#xff08;Power over Ethernet&#xff09;技术时&#xff0c;承担着重要的角色。它不仅负责数据的传输&#xff0c;同时也为网络设备提供电力。在IEEE 802.3标准中&#xff0c;定义了几个与POE相关的标准&#xff0c;包括802.3af、802.3at、802.3bt等&a…

分享6个自己每天都会打开的网站

分享6个自己每天都会打开的网站&#xff0c;有实用办公网站&#xff0c;也有休闲摸鱼网站&#xff0c;链接直达&#xff0c;速看~ 1、鸠摩搜索 https://www2.jiumodiary.com/ 一个免费的电子书下载网站&#xff0c;页面干净无广告&#xff0c;只有一个搜索框&#xff0c;输入…

力扣双指针算法题目:复写零

1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.解题思路 本题要求就是对于一个数组顺序表&#xff0c;将表中的所有“0”元素都向后再写一遍&#xff0c;且我们还要保证此元素之后的元素不受到影响&#xff0c;且复写零之后此数组顺序表的总长度不可以改变&#xff0c;…

微信开发者工具报错 Error: module ‘xxx.js‘ is not defined, require args is ‘xxx.js‘

背景 报错如下 检查 代码逻辑和写法都是ok的微信开发者工具重新打开项目又是可以的 解决方案 先确保微信开发者工具和uniapp的将js编译成es5都开着&#xff08;这个是默认开的&#xff09; 然后把微信开发者工具关了重开 一般做这一步就会好了&#xff0c;但是只是临时解…

基于python 的动态虚拟主机

将自己电脑上的Python脚本文件上传到虚拟机/var/www/cgi-bin/目录下 [rootlocalhost conf.d]# cd /var/www/cgi-bin/ [rootlocalhost cgi-bin]# rz -E rz waiting to receive.编辑vhost.conf配置文件 [rootlocalhost conf.d]# vim vhost.conf<virtualhost 192.168.209.140…

10元 DIY 一个柔性灯丝氛围灯

之前TikTok上特别火的线性氛围灯Augelight刚出来的时候一度卖到80多美金&#xff0c;国内1688也能到400多人民币。 随着各路国内厂商和DIY创客的跟进&#xff0c;功能变多的同时价格一路下滑&#xff0c;虽然有的质感的确感人&#xff0c;但是便宜啊。 甚至关注的up有把成本搞到…

vxe-table合并行数据;element-plus的el-table动态合并行

文章目录 一、vxe-table合并行数据1.代码 二、使用element-plus的el-table动态合并行2.代码 注意&#xff1a;const fields 是要合并的字段 一、vxe-table合并行数据 1.代码 <vxe-tableborderresizableheight"500":scroll-y"{enabled: false}":span-m…

实验三 图像增强—灰度变换

一、实验目的&#xff1a; 1、了解图像增强的目的及意义&#xff0c;加深对图像增强的感性认识&#xff0c;巩固所学理论知识。 2、学会对图像直方图的分析。 3、掌握直接灰度变换的图像增强方法。 二、实验原理及知识点 术语‘空间域’指的是图像平面本身&#xff0c;在空…

使用Session实现单点登录(SSO)

仅仅是一种思路&#xff0c;细节不做具体说明。