Quartz1.6有状态JOB碰到的棘手问题既解决方案

2024-04-05 05:38

本文主要是介绍Quartz1.6有状态JOB碰到的棘手问题既解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于Quartz,我想不要多做介绍了,凡是接触JAVA调度的都会知道这个开源的调度框架.本文就重点说下Quartz中有状态JOB的使用心得.因为我感觉国内的有状态JOB相关的资料比较少,所以在此提供一部分个人的一点经验.主要是针对使用quartz1.6的有状态JOB可能出现的一个棘手问题.

1.关于有状态JOB(StatefulJob)

网上有很多关于有状态JOB的作用与使用的文章,我借鉴下,做下简单的说明:

a). 实现有状态JOB只需要实现org.quartz.StatefulJob 接口即可,StatefulJob 接口仅仅是扩展了 Job 接口,未加入新的方法.

b). Job(无状态)和 StatefulJob 在框架中使用中存在两个关键差异。首先,JobDataMap 在每次执行之后重新持久化到 JobStore 中。这样就确保你对 Job 数据的改变直到下次执行仍然保持着。你可以在有状态 Job 中简单的通过 map 的 put() 方法来修改 JobDataMap.已存在的任何数据会被新的数据覆盖掉。你也能对无状态的 Job 这么做,但是因为对于无状态 Job 来说,JobDataMap 不会持久化,所以数据不会保存下来。

c).  两个或多个有状态的 JobDetail 实例不能并发执行。说的是你创建并注册了一个有状态 JobDetail 到 Scheduler 上。你还建立了两个 Trigger 来触发这个 Job:一个每五分钟触发,另一个也是每五分钏触发。假如这两个 Trigger 试图在同一时刻触发 Job,框架是不允许这种事情发生的。第二个 Trigger 一直会被阻塞直到第一个结束。

--------------------------------------分割线 --------------------------------------

先在在附件里附上quartz2.0需要的jar包,和quartz2.0的docs即sql脚本。

FTP地址:ftp://ftp1.linuxidc.com

用户名:ftp1.linuxidc.com

密码:www.linuxidc.com

在 2014年LinuxIDC.com\9月\Quartz1.6有状态JOB碰到的棘手问题既解决方案

下载方法见 http://www.linuxidc.com/Linux/2013-10/91140.htm

必须的JAR包:
•quartz-2.0.jar,
•slf4j-api.1.6.2.jar
•slf4j-log4j12-1.6.2.jar
•c3p0-0.9.1.jar

--------------------------------------分割线 --------------------------------------

Spring集成Quartz定时任务框架介绍和Cron表达式详解 http://www.linuxidc.com/Linux/2013-03/81947.htm

Spring整合Quartz http://www.linuxidc.com/Linux/2012-12/75284.htm

Spring的Quartz定时器同一时刻重复执行二次的问题解决 http://www.linuxidc.com/Linux/2012-11/73443.htm

Spring 定时器Quartz的用法 http://www.linuxidc.com/Linux/2012-11/73442.htm

--------------------------------------分割线 --------------------------------------

2.使用有状态JOB可能碰到的棘手问题(我目前所碰到的)

在使用quartz1.6版本的时候,我碰到过比较麻烦的问题,后来在iteye和csdn求助都没有解决.还是从国外的文章上找到了一些眉目解决了.

在实现SteafulJob接口后,该JOB怎么搞都只执行一次.

public class SimpleJob implements StatefulJob {
      public void execute(JobExecutionContext context) throws JobExecutionException {
          System.out.println("begin execute...");
          System.out.println("end execute...");
      }
}

 

public static void main(String [] args) {
      try{
          Scheduler scher = StdSchedulerFactory.getDefaultScheduler();      Calendar cal = Calendar.getInstace();
          cal.add(Calendar.SECOND,1);
          Trigger trigger = new SimpleTrigger("JD","JD",cal.getTime (),null,5,3000L);
          JobDetail jobDetail = new JobDetail("JD","JD",SimpleJob.class);
          scher.scheduleJob(jobDetaill,trigger);
          scher.start();
      }catch(Exception ex){
            ex.printStackTrade();
      }
}

后来发现,每次调度启动执行一次后,quartz的记录触发器状态的表就会显示该触发器的状态为:ERROR.

于是从这上面下功夫,还是久久不能解决,然后求助网络.后来尝试了2个方案,终于解决了.

方案一: 国内网站的一个解决方案,说是2个或多个项目使用同一个quartz数据源,会产生冲突出现上述问题,突然想起公司的quartz数据源好像是有2-3个项目连着.结果修改了其他2个项目的quartz数据源,只让我正在弄的项目连接quartz数据源,一样没能解决,只能作罢.估计我出现的问题和这位总结者的问题不一样.

方案二:这是从国外网站看到的一个方案,属于换血型的改动,风险也还是有的.就是进行版本迁移.Quartz1.6及以下版本存在着一些不稳定的状况,具体什么状况我没验证过.但是我是实在不知道怎么下手了,就尝试着将Quartz换成方案中所说的稳定性很不错的版本:2.0版本.然后进行测试,问题就解决了.

Quartz2.0版本作为目前quartz最稳定的版本,还是值得使用的.不过中间的API变动相当大.我列出一些不同的地方.

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2014-09/107005.htm

 

 

 

 

这篇关于Quartz1.6有状态JOB碰到的棘手问题既解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程