XxJob定时任务问题回顾记录

2024-06-12 23:38

本文主要是介绍XxJob定时任务问题回顾记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        Java web开发的日常工作中,大概率会有定时任务的场景,如果这种需求不多的情况下可以用Spring自带的Scheduled定时任务注解:

       如果这种需求较多,写在项目中可能比较混乱,不易管理和迭代,这时可以考虑用XxJob,将任务拆解出来独立成一个服务。XxJob是一个定时任务开源平台,能和Spring程序整合,首先有一个XxJob中心,注册中心登录上去是XxJob可视化面板,可以看到运行报表、任务管理、运行日志,运行日志中可以看到运行的状态,有成功、失败、进行中,服务启动时通过RPC调用向注册中心注册获取执行器地址,并注册任务,任务通过多态调用。 

 向注册中心注册获取执行器地址:

注册任务:

 日志:

       我的环境:服务器centos,容器docker,cpus:2,内存:4G,在docker上跑了10个服务,其它服务运行内存3G,我的4G。

       我的问题:部分服务运行时OOM。

第一阶段

        开始我负责的模块建了六十多个任务,8月初以来,任务一直不稳定,记得有一个周六早上要演示,带来了较多问题,前一天任务运行情况还好。一开始的问题主要是有失败、进行中的,那个时候参与的另一个模块的任务的几个任务也是进行中:

分析问题

       得益于XxJob可视化面板,可以看到失败的日志,基本是代码问题,跨月少表,代码缺陷,就改代码,内存不足就加了内存,从之前的2G加到4G,工作任务的是加到了3G,另外重新安排任务运行时间,期间多次调整过任务时间。

第二阶段

       到了9月中旬,需求基本研发完毕,代码趋于稳定,之前一些不好的写法也已经摒弃(比如一组不变的数据在循环中多次查询,改成在循环外一次查询准备好、部分有价值的统计先算好到一张表,后面用),多亏其他同事帮忙,任务从原来六十多个到二十多个左右,也便于管理,之前自己对公司的统计工具理解不到位,导致任务繁多实现不合理,改造之后,基本都是最可用的任务。问题仍然存在,基本都是进行中的问题。

分析问题

        观察了一段时间后,某一天早上突然发现进行中是因为执行器IP变了,当时彷佛发现了新大陆,以为找到了问题,就问同事,同事说执行器IP变了是因为服务重启了,重新注册后获得新的IP(但是宣哥说发版重建容器IP才会变,嗯,先这样吧),原因是OOM。

       再观察,发现进行中的任务是真的让人迷惑,没有规律,这就很奇怪,如果是代码问题,问题情况应该也是稳定的。主要有以下几点:

1.不是某一个/些固定的任务跑起来会进行中,这次是这个,下次可能是另外一个,之前没出现过的,也有可能出现。

2.不是每天跑任务都会有进行中,今天有,明天可能没有。

3.其他一个服务也有进行中的任务。

寻找问题

       本地运行那些出现过进行中的任务,观察内存占用,不到1G(我本地分配了2G运行内存)。

改代码

       通过观察本地监控,发现Map对象最多,查表也是放到Map,再是对Map的操作于是把用到Map的地方.get能换成.remove的地方换成.remove,遍历一个删一个。然后要查去年的地方把今年和去年也分开查了,改了下还是有进行中的任务。可以释放的地方改动点比较小。

       某一天晚上突然想到会不会是BigDecimal占用字节数太大,导致内存不足,我的所有表的字段基本都是BigDecimal,一共13个字段,一个表2万多数据,平均9张表,,然后网上(https://blog.csdn.net/yunqiinsight/article/details/80431831)找了一个方式,用instrumentation在jvm中监控,测了下BigDecimal占用四十多个字节:

        job中都是放在map中,又在job中测了下,换算了下也就5百M左右,和监控差不多。看日志,发现任务出现运行中的情况时服务确实有重启,但是没找到重启前的异常日志,虽然知道线上的日志位置,但是没权限进去。

还是没有找到问题

        最后实在没辙,想着只有我和另一个同事的两个服务是4G,其它的都是3G,要么改成3G试试。之前听运维同事说抽取服务的内存已经分配很多了,很消耗宿主机资源,就想会不会4G太多了,导致实际运行时给到的内存反而可能少,毕竟其它服务也都是3G了,其它一共9个服务,就27G了。

        改完看来运行正常了,当天中午改了后,下午手动点了下,晚上回去又手动点了下,都运行成功。任务是串行的。

总结:

       先从代码问题入手,自己先思考,再虚心求教。

       任务时间要注意,减少外部影响。

       任务改成用串行,减少内部影响。

       观察规律然后多次尝试。

这篇关于XxJob定时任务问题回顾记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot项目jar依赖问题报错解析

《SpringBoot项目jar依赖问题报错解析》本文主要介绍了SpringBoot项目中常见的依赖错误类型、报错内容及解决方法,依赖冲突包括类找不到、方法找不到、类型转换异常等,本文给大家介绍的非常... 目录常见依赖错误类型及报错内容1. 依赖冲突类错误(1) ClassNotFoundExceptio

MybatisPlus 多数据源切换@DS注解失效问题解决

《MybatisPlus多数据源切换@DS注解失效问题解决》在业务开发中使用到了多数据源,遇到了@DS注解失效问题,有两个场景使用到同一个@DS的查询方法,下面就来介绍一下该问题的解决,感兴趣的可以... 在业务开发中使用到了多数据源,遇到了@DS注解失效问题,有两个场景使用到同一个@DS的查询方法,一个正

Centos7 firewall和docker冲突问题及解决过程

《Centos7firewall和docker冲突问题及解决过程》本文描述了一个在CentOS7上使用firewalld和Docker容器的问题,当firewalld启动或重启时,会从iptable... 目录系统环境问题描述问题排查解决办法总结本文只是我对问题的记录,只能用作参考,不能China编程说明问题,请

JAVA Calendar设置上个月时,日期不存在或错误提示问题及解决

《JAVACalendar设置上个月时,日期不存在或错误提示问题及解决》在使用Java的Calendar类设置上个月的日期时,如果遇到不存在的日期(如4月31日),默认会自动调整到下个月的相应日期(... 目录Java Calendar设置上个月时,日期不存在或错误提示java进行日期计算时如果出现不存在的

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

Nginx错误拦截转发 error_page的问题解决

《Nginx错误拦截转发error_page的问题解决》Nginx通过配置错误页面和请求处理机制,可以在请求失败时展示自定义错误页面,提升用户体验,下面就来介绍一下Nginx错误拦截转发error_... 目录1. 准备自定义错误页面2. 配置 Nginx 错误页面基础配置示例:3. 关键配置说明4. 生效

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

Python中4大日志记录库比较的终极PK

《Python中4大日志记录库比较的终极PK》日志记录框架是一种工具,可帮助您标准化应用程序中的日志记录过程,:本文主要介绍Python中4大日志记录库比较的相关资料,文中通过代码介绍的非常详细,... 目录一、logging库1、优点2、缺点二、LogAid库三、Loguru库四、Structlogphp

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可