文档章节

使用Quartz作为任务调度时 fireTime的一个坑

caiw
 caiw
发布于 2015/02/01 16:53
字数 867
阅读 45
收藏 0
点赞 0
评论 0

         一个任务调度的业务场景:需要在每个小时后2秒钟从数据库中取得当前小时的数据并进行计算,此时使用Quartz做为任务调度,设置每个小时执行一次,sleep2秒以后执行业务代码。并使用Quartz提供的fireTime作为时间条件获取数据。

先看示例代码:

public class QuartzTest {
	public static void main(String[] args) throws SchedulerException {
		//String cron="00 00 * * * ?";
		//为了测试使用就近时间。
		String cron="00 17 * * * ?";
		StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory(); 
		Scheduler stdSchedulerFactory=sf.getScheduler();
	       //50个任务
		for(int i=1;i<50;i++){
			JobDetail jobDetail=JobBuilder.newJob(Job1.class).build();
			Trigger trigger=TriggerBuilder.newTrigger()
					.withSchedule(CronScheduleBuilder.cronSchedule(cron))
					.build();
			sched.scheduleJob(jobDetail,trigger);
		}
		sched.start();
	}

}

Job1.class

public class Job1  implements Job{
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		String dateStr=sf.format(context.getFireTime());
		//记录任务调度的时间
		System.out.println(dateStr);
		try {
		    Thread.sleep(2000);
	            //do someting  with dateStr.... 
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

得到的结果:

2015-02-01 04:27:00
2015-02-01 04:27:00
2015-02-01 04:27:00
2015-02-01 04:27:00
2015-02-01 04:27:00
2015-02-01 04:27:00
2015-02-01 04:27:00
2015-02-01 04:27:00
2015-02-01 04:27:00
2015-02-01 04:27:00
2015-02-01 04:27:01
2015-02-01 04:27:01
2015-02-01 04:27:01
2015-02-01 04:27:01
2015-02-01 04:27:01
2015-02-01 04:27:01
2015-02-01 04:27:01
2015-02-01 04:27:01
2015-02-01 04:27:01
2015-02-01 04:27:01
2015-02-01 04:27:02
2015-02-01 04:27:02
2015-02-01 04:27:02
2015-02-01 04:27:02
2015-02-01 04:27:02
2015-02-01 04:27:02
2015-02-01 04:27:02
2015-02-01 04:27:02
2015-02-01 04:27:02
2015-02-01 04:27:02
2015-02-01 04:27:03
2015-02-01 04:27:03
2015-02-01 04:27:03
2015-02-01 04:27:03
2015-02-01 04:27:03
2015-02-01 04:27:03
2015-02-01 04:27:03
2015-02-01 04:27:03
2015-02-01 04:27:03
2015-02-01 04:27:03
2015-02-01 04:27:04
2015-02-01 04:27:04
2015-02-01 04:27:04
2015-02-01 04:27:04
2015-02-01 04:27:04
2015-02-01 04:27:04
2015-02-01 04:27:04
2015-02-01 04:27:04
2015-02-01 04:27:04

通过结果发现 拿到的fireTime和预期不一样。

这个时候如果使用fireTime去获取数据就会拿到有误差的数据,也会造成业务结果错误。

通过分析发现 Quartz(v2.1.1) 默认使用的是自带线程池的实现:SimpleThreadPool,并且默认为10个线程,在并发任务达到 10 个以后,再有触发的任务就无法被执行了,只能等待有空闲线程的时候才能得到执,这也是为什么结果中只有前10个结果是符合预期的。

我们可以添加配置文件来修改Quartz的一些默认配置项,并发数:

org.quartz.threadPool.threadCount=50;

也可以直接在代码中修改:

StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory(); 
Properties pro=new Properties();
pro.setProperty("org.quartz.threadPool.threadCount", "50");
stdSchedulerFactory.initialize(pro);

 但是必须指出一点,这个初始线程数并不是越大越好。当并发线程太多时,系统整体性能反而会下降,因为系统把很多时间花在了线程调度上。

© 著作权归作者所有

共有 人打赏支持
caiw
粉丝 2
博文 15
码字总数 5222
作品 0
成都
Quartz任务调度源码分析

从源码分析中可以看出,任务的整个调度过程为,初始化线程池,及调度器QuartzScheduler,然后由线程池去执行QuartzSchedulerThread,将触发器任务(job与触发器)添加到存储器(TreeSet,timeT...

sgkbkega
2016/09/08
17
0
基于 Quartz 开发企业级任务调度应用

简介: Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。作为一个优秀的开源调度框架,Quartz 具有功能强大,应用灵活,易于集成的特点。本文剖析了 Qu...

IBMdW
2013/05/19
12.9K
29
quartz集群

其实主要还是借鉴别人的东东,写的还挺好的。我自己只在最后说说自己遇到的坑吧。 1、Quartz任务调度的基本实现原理   Quartz是OpenSymphony开源组织在任务调度领域的一个开源项目,完全基...

梦蝶飘雪
2016/08/12
188
0
基于quartz的云调度中心实现

一、背景 作为业务开发人员,会经常需要写一个定时任务。目前,写定时任务应用最广泛最成熟的方案是OpenSymphony开源组织在任务调度领域的一个开源项目quartz,比如要写一个定时数据同步任务...

zjytk05
2016/05/19
3.3K
33
Java Web应用中如何实现任务有效调度

任务调度是大型J2EE web应用中常见的工作。开发者希望以指定的间隔时间执行各类操作,并完成一些无需用户输入的任务。Java中可有无数方法来做到这一点,但是在web应用中却并没有这方面的统一...

zhengguogaun
2013/06/19
0
0
SpringMvc自动任务调度之task实现项目源码

前提注意:配置文件中如果 default-lazy-init="true",删掉或设置成false,不然注解会失效(这个坑找了好久)。 一、说明 以前项目一直使用Quartz的定时任务,虽然其功能强大,但是配置文件极其...

小柒2012
2016/07/15
444
0
quartz2.2源码分析1-使用和原理

前言 Quartz是一款由java写成的作业调度框架,在大量javase/javaee应用中被用来做定时任务,它功能强大而又不失使用简单性。 使用例子 maven引入: 加入配置文件org/quartz/quartz.propertie...

Small-Liu
2016/04/23
879
0
quartz (从原理到应用)详解篇

目录: 一、Quartz 基本介绍 1.1 Quartz 概述 1.2 Quartz特点 1.3 Quartz 集群配置 二、Quartz 原理及流程 2.1 quartz基本原理 2.2 quartz启动流程 三、Spring + Quartz 实现企业级调度的实现...

为梦而来
2016/12/08
1K
7
为什么要用分布式集群任务调度?

作为一个开发者,避免不了定时任务的问题,最粗暴和简单直接的解决方案就是crontab。当然在机器少,任务不多,定时任务之间关联少的情况下,crontab效率还是比较高和便捷的。但当机器越多、定...

调皮仔3683
05/04
0
0
用quartz实现多任务动态加载

Quartz是什么 Quartz是一个用Java编写的任务调度框架,任务调度是什么,举例说明:比如我们需要在每个星期四下午三点时候发周报,我们需要一个系统在两点半的时候给我们一个发周报的提醒,这...

随影求是
2012/05/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

expect(spawn) 自动化git提交和scp拷贝---centos(linux)

**在进行SCP文件拷贝中,往往需要进行用户密码的输入,即用户交互。若采用自动化脚本的方式进行,则可用以下方式: ** #!/usr/bin/expect #设置参数 set src [lindex $argv 0] set dest [lin...

helplove
10分钟前
1
0
用Build来构建对象的写法

如果一个类的属性过多,用构造器来构建对象很难写,因此我们时用Build方式来构建对象。写法大致如下。 import java.io.Serializable;import java.util.Date;public class Log impleme...

算法之名
12分钟前
11
0
利用 acme.sh 获取网站证书并配置https访问

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.(https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E) 主要步骤: 安装 acme.sh 生成证书 copy 证书到 nginx/ap...

haoyuehong
25分钟前
2
0
微擎框架内如何根据media_id获取到微信图片的路径

微擎的框架内,图片选择后,获取的是那个字符串是media_id,相当于你这张图片在微信的图片服务器里面的id 要求是:获取https://mmbiz.qpic.cn/mmbiz_jpg/…… 微信图片的路径 而微信并没有根据m...

老bia同学
29分钟前
2
0
Spring boot中日期的json格式化

Model 在model层中,类的日期属性上面添加如下注解: @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss") 参考 Jackson Date格式化教程...

亚林瓜子
31分钟前
2
0
Eclipse:Failed to load the JNI shared library

1.问题背景: 由于我之前使用jdk1.9学习,当使用Luke的时候发现jdk版本过高,需要向下配置jdk,就向朋友拷了一个安装包。重新配置路径后,便开始报错。 2.问题描述: Failed to load the JNI...

tinder_boy
33分钟前
1
0
少儿学习编程课程是否真的适合七八岁的低龄儿童[图]

少儿学习编程课程是否真的适合七八岁的低龄儿童[图]: 天下熙熙皆为利来,天下攘攘皆为利往。 这几年来,乐高教育机构在国内如同雨后春笋般出现,当然关闭/转手的也很多。从教师角度来看,部...

原创小博客
39分钟前
1
0
ES12-词项查询

1.词项查询介绍 全文查询将在执行之前分析查询字符串,但词项级别查询将按照存储在倒排索引中的词项进行精确操作。这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段。 或者,...

贾峰uk
47分钟前
2
0
http状态码与ajax的状态值

ajax状态值 1.1 200 & OK:状态请求成功

litCabbage
50分钟前
2
0
iOS动画效果合集、飞吧企鹅游戏、换肤方案、画板、文字效果等源码

iOS精选源码 动画知识运用及常见动画效果收集 3D卡片拖拽卡片叠加卡片 iFIERO - FLYING PENGUIN 飞吧企鹅SpriteKit游戏(源码) Swift封装的空数据提醒界面EmptyView 沙盒文件浏览与分享调试控...

sunnyaigd
53分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部