Quartz实现定时任务(一)

前言

有段时间没写blog了,说来惭愧,最近一直在给公司做P2P项目的服务端,但这都不是借口,高尔基曾说过(不太确定T_T),时间就像海绵里的水,只要愿意挤总是有的!所以写博客的节奏还是必须脉动回来,必须养成不断学习,不断记录,不断总结的好习惯。废话不多说,最近需要做一些服务器端的定时任务,决定使用Quartz去实现,之前也没接触过,所以就边学边做了,顺便把这个过程记录下来。

初识Quartz

首先看一下百科中对Quartz的简介:Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或
EJBs。Quartz的最新版本为Quartz 2.2.1。

没错,Quartz是一个由Java编写的开源的任务调度框架。目前已发布的最新版本是2.2.1,下载地址:

http://www.quartz-scheduler.org/downloads

下载完成后可以看到如下的结构图,

我们使用Quartz时需要在lib文件夹下拷出核心jar包(quartz-2.2.1.jar)添加到我们项目的classpath下,然后就可以使用Quartz的相关API了,下来我们根据官方的在线教程来快速的体验一下Quartz。但在使用之前首先我们需要了解关于Quartz的3个核心接口,分别是:Job、Trigger和Scheduler。简单的讲,Job就代表我们需要调度的任务,Trigger就是触发任务的触发器,而Scheduler就是用来绑定Job和Trigger并执行任务。首先,我们需要准备一个Job,

package com.test;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SimpleJob implements Job {

	@Override
	public void execute(JobExecutionContext jobCtx)
			throws JobExecutionException {
		// TODO Auto-generated method stub
		System.out.println("Triggered. Time is " + new Date());
	}

}

让我们自己的Job类实现Job接口并重写execute方法,在这个方法中去写我们需要定时调用的业务逻辑代码,这里仅仅打印了当前时间。接下来我们就可以写一个测试类去执行这个Job了,当然还缺少2个关键的对象,我们需要一个Trigger去触发Job,还需要一个Scheduler去管理Job、Trigger并执行他们,参考一下官方教程中实例化Scheduler的方法,

SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
  Scheduler sched = schedFact.getScheduler();
  sched.start(); 

可以看到是通过SchedulerFactory去得到的Scheduler的实例,并通过start方法启动调度。接下来是实例化Job,依旧参考官方教程中的代码,

 // define the job and tie it to our HelloJob class
  JobDetail job = newJob(SimpleJob.class)
      .withIdentity("myJob", "group1") // name "myJob", group "group1"
      .build();    

这里又见到了一个新的接口——JobDetail,其实Quartz在每次执行Job的时候都会重新创建一个Job实例,所以它不是直接接收一个Job的实例,而是接收一个Job的实现类,以便运行时通过newInstance方法的反射调用机制去实例化Job。在2.2.x的版本中不能直接使用构造方法,而是需要通过JobBuilder去实例化JobDetail对象,如上代码所示,通过静态导入引入了JobBuilder类并通过其静态方法newJob去实例化了JobDetail对象。现在还缺少一个Trigger去触发Job,那么继续参考教程中的代码,

 // Trigger the job to run now, and then every 40 seconds
  Trigger trigger = newTrigger()
      .withIdentity("myTrigger", "group1")
      .startNow()
      .withSchedule(simpleSchedule()
          .withIntervalInSeconds(5)
          .repeatForever())
      .build(); 

可以看到写法上都很类似,通过TriggerBuilder.newTrigger()方法实例化Trigger对象,其实Trigger有2个子类,分别是SimpleTrigger和CronTrigger,SimpleTrigger适用于执行一次或者固定间隔周期性执行,而CronTrigger则可以通过Cron表达式定义出各种复杂的调用方案,例如每周周三执行、每天下午6点执行等等。我这里设置的5秒调用一次,repeatForever也就是无限调用了,万事俱备只欠东风,最后通过Scheduler绑定执行Job和Trigger即可,

 // Tell quartz to schedule the job using our trigger
  sched.scheduleJob(job, trigger);

最后看一下Test类中的完整代码并运行程序:

package com.test;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class Test04 {

	public static void main(String[] args) {
		try {
			// Grab the Scheduler instance from the Factory
			Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
			scheduler.start();

			// Job
			JobDetail job = JobBuilder.newJob(SimpleJob.class)
					.withIdentity("myTrigger", "group1").build();

			// Trigger
			Trigger trigger = TriggerBuilder
					.newTrigger()
					.withIdentity("trigger1", "group1")
					.startNow()
					.withSchedule(
							SimpleScheduleBuilder.simpleSchedule()
									.withIntervalInSeconds(5).repeatForever())
					.build();

			scheduler.scheduleJob(job, trigger);
		} catch (SchedulerException se) {
			se.printStackTrace();
		}
	}
}

运行之后可以看到控制台会每隔5S打印一次输出语句,

总结

本篇blog算是对Quartz的入门,了解了三个关键性的基础概念:任务(Job)、触发器(Trigger)和调度器(Scheduler),在实际项目中一般我们都会在web项目中去执行一些定时任务,后序的blog会介绍Quartz整合到Spring中从而实现服务器端的定时任务以及关于Quartz的一些高级特性,敬请关注。

时间: 2024-11-05 12:26:29

Quartz实现定时任务(一)的相关文章

【spring-boot】 springboot集成quartz实现定时任务

在做项目时有时候会有定时器任务的功能,比如某某时间应该做什么,多少秒应该怎么样之类的. spring支持多种定时任务的实现.我们来介绍下使用spring的定时器和使用quartz定时器 1.我们使用spring-boot作为基础框架,其理念为零配置文件,所有的配置都是基于注解和暴露bean的方式. 2.使用spring的定时器: spring自带支持定时器的任务实现.其可通过简单配置来使用到简单的定时任务. @Component @Configurable @EnableScheduling p

Spring Boot集成quartz实现定时任务并支持切换任务数据源

org.quartz实现定时任务并自定义切换任务数据源 在工作中经常会需要使用到定时任务处理各种周期性的任务,org.quartz是处理此类定时任务的一个优秀框架.随着项目一点点推进,此时我们并不满足于任务仅仅是定时执行,我们还想要对任务进行更多的控制,随时能对任务进行人为干预,就需要对quartz有更深入的了解.而随着微服务的流行,项目中多数据源的情况也越来越常见,在定时任务中集成多数据源切换的功能也需要集成进来. 集成quartz实现定时任务 集成quartz实现定时任务 quartz中实现

Spring+quartz 实现定时任务job集群配置

为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真实结果的3倍,那对银行来说是无法想象的,完全不可接受. 集群定时任务工作原理 所以为了解决以上问题,每个server把将要及正在运行的job所有状态都即时同步到中央数据库,然后再次触发调用时从数据库中分析是否已有别的server正在运行相同job (同名同定时时间点的job属于相当job),如果相同

Quartz.net 定时任务之简单任务

一.概述 1.quartz.net 是一款从java quartz 上延伸出来的定时任务框架. 2.我在网上看到很多大神写过关于quartz.net 的博客.文章等,在这些博客文章里也学会了很多关于quartz的知识.今天博主也想写一篇关于quartz的文章(不足之处望大神斧正),希望能帮助正在学习quartz路上的兄弟姐妹,顺便也巩固自己. 3.quartz这篇博客会从最基础的开始,之后会逐渐的升级,如果有喜欢的兄弟姐妹,请关注我的博客,博主会持续更新 二.搭建 1.打开vs创建新的mvc空项

sping的quartz设置定时任务

除了spring相关的jar包之外,还需要引入quartz-all-1.6.6.jar. spring配置文件增加quartz-bean.xml和quartz-set.xml quartz-bean.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&qu

Spring整合quartz实现定时任务

quartz比timer的功能更强大,结合spring可以简化quartz的配置来实现定时任务. 1 导入包:quartz-all.jar 2 创建定时执行的任务类(类名可以是普通类名): package com.web.quartz; import java.text.SimpleDateFormat; import java.util.Date; public class Task { public void execute(){ String now=new SimpleDateForma

SpringMVC整合Quartz实现定时任务以及Tomcat服务执行初始化定时任务

1.导入quartz.jar包,或者pom.xml 配置对应的依赖: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.6</version> </dependency> 2.在Web项目web.xml中配置quartz的配置文件加载路径: <servlet&g

Spring+Quartz实现定时任务的配置方法

1.Scheduler的配置 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="testTrigger"/> </list> </property> <property name=&q

ssh中使用spring的集成quartz 开发定时任务

之前没有使用框架开发时对于开发定时任务都是 使用java的原声timer类,重写线程的run方法跑要执行的任务.刚刚换的新公司,项目使用ssh2,目前该项目中的定时任务的使用spirng集成的quartz工具,非常方便.好了,废话不多说,说一下开发过程. 首先,需要建一个资源配置xml文件,一般以quartz结尾.如我项目中的该文件名为:applicationContext-bms-sendxml-quartz.xml,别忘了在applicationContext.xml文件中导入该文件.app

quartz (二) Spring+Quartz实现定时任务的配置方法

JobDetail  设置执行的任务 :CronTrigger   触发器:设置执行的时间规则      ;  Scheduler    // 调度器,将任务与执行时间关联 本文转自:http://www.oschina.net/question/8676_9032 1.Scheduler的配置 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property nam