Quartz 介绍
一般用来 作业定时调度,比如 要在每周日 执行一次xx操作,就是后台启动一个线程。
与其他产品对比
从实现的技术上来分类,目前主要有三种技术(或者说有三种产品):
- Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少,这篇文章将不做详细介绍。
- 使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,稍后会详细介绍。
- Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,稍后会介绍。
下载地址
Quartz 的核心接口及应用
Quartz 的核心接口 (常用)
核心接口之间的关系
Trigger
SimpleTrigger
每一分中执行一次某一天执行,2016-06-01执行;
- ConTrigger
- 完成更为复杂的触发 “每个月的最后一天执行
每个月的第一个星期的第二天中午11:55分执行;
每年的第二个月的第三个星期第四天晚上20:30分执行;”
- 完成更为复杂的触发 “每个月的最后一天执行
- Cron Expressions
- 用表达式表达程序的调度规则
Quartz 简单案例
简单调度
Cron 表达式调度
Quartz 与 Spring 集成
创建一个简单的Job
... extends QuartzJobBean{
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Myjob 执行了..........."+context.getTrigger().getKey().getName());
ApplicationContext applicationContext = (ApplicationContext)context
.getJobDetail().getJobDataMap().get("adc");
System.out.println(applicationContext);
System.out.println("获取的Spring容器是:" + applicationContext);
System.out.println("当前时间:"+new Date().toString());
}
配置spring
<bean name="myjobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 指定具体的job类 -->
<property name="jobClass" value="com.lich.spring.MyJob" />
<!-- 指定job的名称 -->
<property name="name" value="myJob" />
<!-- 指定job的分组 -->
<property name="group" value="jobs" />
<!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务 -->
<property name="durability" value="true"/>
<!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 -->
<property name="applicationContextJobDataKey" value="adc"/>
</bean>
<!-- 定义触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myjobDetail" />
<!-- 每一分钟执行一次 -->
<property name="cronExpression" value="*/5 * * * * ?" />
</bean>
<!-- 定义调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
<ref bean="cronTrigger1" />
</list>
</property>
</bean>
加载spring容器
public static void main(String[] args) {
// 写对应的配置文件
new ClassPathXmlApplicationContext("classpath:Spring.xml");
}