Java定时任务不明原因挂掉(定时任务挂掉)以及建议

在Java企业级开发中,Spring框架的定时任务功能(通常通过@Scheduled注解实现)因其易用性和灵活性而备受青睐。然而,当这些定时任务在生产环境中莫名停止时,往往会让开发者头疼不已。

一、常见原因剖析

1.线程或资源耗尽

  • 线程池耗尽:任务中存在长时间处理操作,等同IO阻塞,新的定时任务可能会被延迟或取消
  • 系统资源不足:CPU、内存等资源不足可能导致JVM响应变慢,影响定时任务的执行。
  • 数据库连接池耗尽:如果定时任务依赖于数据库操作,连接池耗尽也会成为问题。
2. 代码缺陷而未捕获处理异常
  • 异常处理不当:未捕获的异常可能导致任务线程异常终止,下面有原因分析。
  • 静态变量/单例问题:在并发环境下,静态变量或单例的不当使用可能导致数据不一致或任务执行异常
3. 外部依赖故障
  • 网络故障:如任务中调用外部服务(如API调用),API挂掉或网络问题而未设置超时时间,等同IO阻塞。(使用HttpClient不设置超时将导致线程永久等待)
  • 第三方库/框架问题:使用的第三方库或框架可能存在bug(如死循环或死锁等),等同IO阻塞。例如:一个log4j2与disruptor的bug引起的问题。
二、诊断步骤
  1. 检查日志:首先查看应用日志,寻找可能的错误或异常信息。在代码中插入必要的日志进行定位,找到出问题的那行代码。
  2. 监控工具:使用JVM监控工具或其他工具检查系统的资源:cpu、内存、线程情况。
  3. debug和运行环境对比:编写或运行相关的单元测试,找到问题代码。

最常见的问题是:

代码有死循环bug,代码有死锁,任务中有各种原因的异常抛出而未try-catch,各种IO阻塞,线程等资源耗尽。

一个ScheduledExecutorService启动的Java线程无故挂掉的原因是:如果使用者抛出异常,ScheduledExecutorService 将会停止线程的运行,而且不会报错,没有任何提示信息。解决方法是:try-catch将异常信息。下面是复现代码:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;/***一个ScheduledExecutorService启动的Java线程无故挂掉的原因是:如果使用者抛出异常,ScheduledExecutorService 将会停止线程的运行,而且不会报错,没有任何提示信息。*/
public class ScheduledExecutorServiceTest {private static int i = 0;private static int j = 10;public static void main(String[] args) {ScheduledExecutorService exc = Executors.newSingleThreadScheduledExecutor();exc.scheduleAtFixedRate(new Runnable(){@Overridepublic void run() {i++;if (i==6) {throw new RuntimeException();} else {System.out.println(i);}}}, 0, 1, TimeUnit.SECONDS);exc.scheduleWithFixedDelay(new Runnable(){@Overridepublic void run() {j++;if (j==14) {throw new RuntimeException();} else {System.out.println(j);}}}, 0, 1, TimeUnit.SECONDS);}
}

建议和处理方法是:

1. 检查是否存在IO阻塞的地方,或者代码,设置一个超时时间,如API调用,可以设置连接超时时间或读取超时时间。即同步阻塞IO换为异步非阻塞IO,或者设置超时时间。

2. fixedRate 换为 fixedDelay,后者是必须等上一次任务结束才能进行下一次任务。前者如果任务中存在长时间操作,上次任务未完成又开启一次任务,可能会导致线程池满

3. 在定时任务的最外层try-catch处理各种可能出现的异常。

作者在某项目中也遇到同样问题,在经过上面3个处理后(设置超时时间,异步非阻塞,try-catch,fixedDelay),完美解决问题。

package com.loyotech.uav.util;import com.alibaba.fastjson.JSONObject;
import com.loyotech.uav.core.config.WGlobalNames;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;import okhttp3.OkHttpClient;
import org.springframework.stereotype.Component;import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;/*** 对okhttp的封装*/
@Component
@Slf4j
public class OkHttpManager {public String handleGet(String url){// 创建 OkHttpClient 实例OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).build();// 构建请求Request request = new Request.Builder().url(url + WGlobalNames.safePlatformToken) // 请求的 URL.get() // 设置为 GET 请求.build(); // 构建请求对象try {// 发送同步请求Response response = okHttpClient.newCall(request).execute();// 检查请求是否成功if (response.isSuccessful()) {// 返回响应体内容return response.body().string();} else {log.error("请求失败,状态码: {},{}" , response.code(),url);}} catch (IOException e) {// 处理可能的异常log.error("请求失败,状态码: {}," ,url,e);}return null;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

USB 驱动开发 --- Gadget 驱动框架梳理(一)

本文由 Linux 内核文档翻译与总结而来,个人学习笔记仅供参考。 Gadget 框架 在 USB 协议交互过程中,角色定义: the device driver is the master (or “client driver”) Linux 内核中称为 HCD(Host Controller Driver),负责与 …

python实现pdf转word和excel

一、引言   在办公中,我们经常遇收到pdf文件格式,因为pdf格式文件不易修改,当我们需要编辑这些pdf文件时,经常需要开通会员或收费功能才能使用编辑功能。今天,我要和大家分享的,是如何使用python编程实现…

Jenkins-基于Role的鉴权机制

jenkins自带了一些全局性的安全配置。 但无法通过job等相对细粒度的来控制使用者的权限。但它可以借助相关的插件实现细颗粒的权限控制。 插件: Role-based Authorization Strategy 需要在configure global security中配置授权策略如下: 保存后&#x…

差分(前缀和的逆运算)

作用: 在 [ l ,r ] 数组中,对全部数字c 思路 原数组a 构造差分数组b使得a[i]b1b2b3...bi; a数组是b数组的前缀和,b1b2b3...bnan b[i] a[i]-a[i-1]; 在d21,那在前缀和时,这些a都1 在数组中,要l~r这段数c 在l处c后&#xff0c…

【转】厚植根基,同启新程!一文回顾 2024 OpenHarmony 社区年度工作会议精彩瞬间

在数字化浪潮奔腾不息的今天,开源技术已成为推动科技创新与产业发展的强大引擎。2025年1月10日-11日,OpenAtom OpenHarmony(开放原子开源鸿蒙,以下简称“OpenHarmony”或“开源鸿蒙”)社区2024年度工作会议于深圳盛大启…

flutter 常用UI组件

文章目录 1. Toast 文本提示框oktoastbot_toast2. loading 加载窗flutter_easyloading3. 对话框gex dialog4.下拉刷新pull_to_refresh5. pop 窗custom_pop_up_menu6. pin code 密码框pinput7. 二维码qr_flutter8. swiper 滚动组件carousel_sliderflutter_swiper_view9. Badge 角…

重学SpringBoot3-Spring Retry实践

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-Spring Retry实践 1. 简介2. 环境准备3. 使用方式 3.1 注解方式 基础使用自定义重试策略失败恢复机制重试和失败恢复效果注意事项 3.2 编程式使用3.3 监听重试过程 监…

爬虫第二篇

太聪明了怎么办?那就,给脑子灌点水!! 本篇文章我们来简单讲一下如何爬取mv,也就是歌曲视频,那么我们进入正题。 由于上次拿网易云开了刀,那么这次我们拿酷狗开刀。 还是进入上次讲过的页面 注意&#xff…

【ArcGIS微课1000例】0140:总览(鹰眼)、放大镜、查看器的用法

文章目录 一、总览工具二、放大镜工具三、查看器工具ArcGIS中提供了三种局部查看的工具: 总览(鹰眼)、放大镜、查看器,如下图所示,本文讲述这三种工具的使用方法。 一、总览工具 为了便于效果查看与比对,本实验采用全球影像数据(位于配套实验数据包中的0140.rar中),加…

快手极速版如何查找ip归属地?怎么关掉

在数字化时代,个人隐私的保护成为了广大用户关注的焦点。快手极速版作为一款备受欢迎的短视频应用,其IP归属地的显示与关闭功能自然也成了用户热议的话题。本文将详细介绍如何在快手极速版中查找IP归属地以及如何关闭IP属地显示,帮助用户更好…

MQ消息队列

1、消息队列特点 2、RabbitMQ

Web自动化:Cypress 测试框架概述

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 Cypress 测试框架概述 1.1 Cypress 默认文件结构 在Cypress安装完成后,其生成的默认文件目录如下所示: 1.1.1 Fixtures Fixture又称之为测…

基于SSM汽车美容管家【提供源码+答辩PPT+文档+项目部署】(高质量源码,可定制,提供文档,免费部署到本地)

作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

tlias部门管理-新增部门-接口开发

需求 点击 "新增部门" 的按钮之后,弹出新增部门表单,填写部门名称之后,点击确定之后,保存部门数据。 了解了需求之后,我们再看看接口文档中,关于新增部门的接口的描述,然后根据接口…

蓝桥杯 Python 组知识点容斥原理

容斥原理 这张图初中或者高中数学课应该画过 也就是通过这个简单的例子引出容斥原理的公式 这张图的面积:s1 s3 s7 - 2 * s2 - 2 * s4 - 2 * s6 3 * s5 通过此引导出容斥原理公式 那么下面来一起看看题目 题目描述 给定 n,m 请求出所有 n 位十进制整数中有多…

本地仓库管理之当前分支内的操作

以刚搭建好的git仓库为例,刚搭建完的仓库只有master分支,使用git branch查看当前的分支情况。 elfubuntu:~/work/example/hello$ git branch *所在分支为当前分支,即master分支 当前分支进行源码修改时简单流程图如下: 在当前分…

Spring Web MVC综合案例

承接上篇文章——Spring Web MVC探秘,在了解Spring Web MVC背后的工作机制之后,我们接下来通过三个实战项目,来进一步巩固一下前面的知识。 一、计算器 效果展示:访问路径:http://127.0.0.1:8080/calc.html 前端代码&a…

Linux之文件系统前世今生(一)

Linux在线1 Linux在线2 一、 基本概念 1.1 块(Block) 在计算机存储之图解机械硬盘这篇文章中我们提到过,磁盘读写的最小单位是扇区,也就是 512 Byte;很明显,每次读写的效率非常低。 为了提高IO效率&…

SpringMVC 实战指南:打造高效 Web 应用的秘籍

第一章:三层架构和MVC 三层架构: 开发服务器端,一般基于两种形式,一种 C/S 架构程序,一种 B/S 架构程序使用 Java 语言基本上都是开发 B/S 架构的程序,B/S 架构又分成了三层架构三层架构: 表现…

MySQL、HBase、ES的特点和区别

MySQL:关系型数据库,主要面向OLTP,支持事务,支持二级索引,支持sql,支持主从、Group Replication架构模型(本文全部以Innodb为例,不涉及别的存储引擎)。 HBase&#xff1…