集群环境下,谁偷走quartz配置的定时任务

简介:

错误现象:

在本地开发环境中,应用服务启动后TRIGGER_STATE直接就变为ERROR

 

 前段时间在项目中,使用quartz配置一个定时任务,定时任务都持久化到oracle数据库中,但是应用服务器启动后,数据库qrtz_triggers(trigger信息表)中,对应的任务数据的TRIGGER_STATE字段就直接变为ERROR,导致定时任务不执行。

 

没有错误log日志,出错原因难定位。

对以下可能出错的原因进行了调查:

1.quartz文件配置错误

   检查配置文件,调查结果是,配置文件没有发现错误。

   项目中已经配置有一条定时任务A,但是任务A能正常执行。

   将任务Aquartz配置注释,只留下新增配置的定时任务,启动后还是一样报错。

项目中,其他子系统也使用了quartz配置定时任务,可以排除不是quartz配置文件错误。

 

2.定时任务实现类出错

   定时任务实现类中,将业务逻辑全部注释,只输出system.out.println,但启动后,也报错。(经过很多次的调试,有时应用服务器启动,也能正常的执行一次新增的定时任务,但后面TRIGGER_STATE就又变为ERROR

   将新增的定时任务配置的时间,由2分钟改为10秒后,定时任务能正常运行。

 

3.发现数据库qrtz_scheduler_state(调度器状态表)中,有很多条数据。表示有很多实例应用都在运行quartz

 

经过这些测试和调查,发现是其它机器可能将新增的定时任务取走执行,但是其它机器上又没有配置该新增定时任务,然后再调度该任务的时候就将数据库qrtz_triggersTrigger信息表)中,对应的任务数据的TRIGGER_STATE字段变为ERROR

 

综上所述,本地开发环境下,项目组成员使用同一数据库进行开发时,每位开发人员在quartz中,配置的定时任务数量不一致。当应用服务启动后,quartz任务调度器会根据数据库qrtz_triggerstrigger信息表)中的数据执行Job,数据库中已经存在新增的定时任务,而取走的应用服务quartz配置中并没有配置该新增定时任务,执行时就将TRIGGER_STATE变为ERROR,导致新增Job不能正常执行。

 

建议:

使用quartz配置定时任务,多台服务器使用同一数据库进行开发时,保证数据库qrtz_scheduler_state(任务调度表)中只有一条数据,这样就能保证定时任务是自己的应用服务取走执行的。


目录
相关文章
|
存储 JSON NoSQL
【MongoDB】MongoDB的数据存储格式
【4月更文挑战第1天】【MongoDB】MongoDB的数据存储格式
|
SQL Java 调度
SpringBoot集成quartz定时任务trigger_state状态ERROR解决办法
SpringBoot集成quartz定时任务trigger_state状态ERROR解决办法
|
应用服务中间件 Linux nginx
OBS+Nginx+VLC推拉流
【2月更文挑战第6天】推拉流分为推流和拉流。推流就是将client端的视频画面推送到流媒体服务器;拉流就是另外一个client端从流媒体服务器获取视频画面。
1534 0
OBS+Nginx+VLC推拉流
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
数据库连接 数据库 数据安全/隐私保护
FlaskMigrate使用指南
**Flask-Migrate** 是一个整合 Flask、SQLAlchemy 和 Alembic 的扩展,用于管理数据库迁移。安装所需库:`pip install Flask mysql-connector-python Flask-SQLAlchemy Flask-Migrate`。
791 0
IDEA常用配置之代码自动格式化删除无用导入
IDEA常用配置之代码自动格式化删除无用导入
1279 1
|
前端开发 JavaScript API
实时搜索建议
实时搜索建议
|
SQL 前端开发 测试技术
谷粒商城--SPU和SKU(属性分组、规格参数、销售属性)-1
谷粒商城--SPU和SKU(属性分组、规格参数、销售属性)
861 0
|
Ubuntu 开发工具
ubuntu 网卡 ens33 改名 eth0 方法
ubuntu 网卡 ens33 改名 eth0 方法
641 0