111 记录一次 xxl-job 任务直接卡死两天

2024-04-15 11:36

本文主要是介绍111 记录一次 xxl-job 任务直接卡死两天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

呵呵 周末爆发的一波问题

然后 没办法 让周末解决, 先保存一个 堆栈信息, 和 堆dump信息 

然后 重启, 没问题了 

 

这个主要是最近碰到的一个问题

再 xxl-job 上面, 某任务 107, 手动执行 或者 自动执行 有触发日志, 但是没有 执行日志

通篇的效果类似于如下, 这个时间点 之后的所有任务 都是这个状态

从结果上来看 就是接下来之后的任务进入了 队列, 但是 因为是序列执行, 14:00 的时候这一次任务 一直再执行, 并且 一直未执行完成, 然后 导致 14:00 之后的任务 一直存在于 任务队列, 并未执行

2f6463a632bd4d6399d0e6b5f182fc43.png

 

 

问题的排查

首先要看的是 队列的任务的信息, 和 定时任务日志中记录的任务的信息

可以看到的是 170 的任务队列有 180 条数据, 其中 14:00 这一条正在执行, 其他的均在 任务队列

e7ebb3daedc540f1ad5a99a50706c672.png

 

堆 dump 中查看 TriggerParam 可以看到 180 个, 对应的就是 这一条正在执行的任务 和 179 个队列中的对象

07098b16acdb46d4bc30b9a1d8037b92.png

 

看一下 线程的执行情况, 可以看到的是 线程当前是在 发送请求, 并且 解析响应头的地方

这部分代码 是再工具代码中, 不过 可以稍微看一下

754677718f7b4400bcd75f96a853ff27.png

 

这部分的请求发送代码 大致如下, 执行中的任务是再 195 行

05fcba9e851545abaa0bbb5ade7cdd27.png

查看一下任务执行日志, 可以看到 14:00 的任务执行日志是存在的, 并且 有一句任务进入的输出

然后 14:15 的日志是没有的, 结合上面堆栈信息, 可以分析出 任务执行是再 14:00 执行, 并且 阻塞到现在

bf6d82beb03e4fb9be24638fd04cb7c5.png

 

我们还可以探查一下 查询参数, 这个可以通过 HttpURLConnection 的输出流进行解析

通过 HttpURLConnection 找到输出流, 找到对应的输出缓冲区, 采集这部分输出的字节, 然后进行 解析, 可以得到参数如下 {"areaCode":"61","startTime":"2023-07-13","endTime":"2023-07-13"} 

030dcd592f8b4d85a36e74db994f768b.png

 

看一下 HttpResponse 的状态

只设置了 url, method, 阻塞在设置 headers 的地方

ba4d2c830cd64eb392d93ee5dd6bf9f0.png

 

看一下 jstack, jmap 的 dump 时间

b06c092692ef4632ba2d53f6e03ff6b1.png

33d23629356e4e509b744932aa4cc0c5.png

 

 

网络数据读取这边的处理

根据 HttpURLConnection 找到对应的 HttpClient, 然后找到 对应的 BufferedInputStream

可以看到 从 SocketInputStream 获取数据就一直阻塞在 SocketInputStream.socketRead

a36b6f3242bd49e788895ecf92cec8c2.png

 

然后 传入的 timeout, 查询给定的 SocketInputStream 的 SocksSocketImpl 的信息, 可以看到 timeout 为 0, 表示 无限期等待

26ffa42710fa4f28b5e7148470386ee3.png

 

然后 这一系列现象 是可以证实 最上面的推导

呵呵 这也是一个 很奇葩的现象, 相当于这个请求从 13号14:00开始发送, 然后到 15号09点, 还阻塞在这里, 并且看样子 会一直阻塞

使用 jdk 的 java.net.URLConnection.getHeaderFields 阻塞住了, 不清楚是 对方服务存在问题, 还是什么 其他现象

但是 按正常情况来考虑, 应该会 抛出异常, 或者 超时才对

这种情况下, 客户端这边 手动设置一下 超时, 让其 超时抛出异常即可

 

 

完 

 

 

 

这篇关于111 记录一次 xxl-job 任务直接卡死两天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/905710

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定