Quartz是一个开源的作业调度框架,其中分3部分:
1.作业 ,需要实现org.quartz.Job接口
2.触发器 常用的有:
2-1.SimpleTrigger
2-2.CronTrigger
可以定制复杂时间 Cron表达式:Seconds Minutes Hours DayofMonth Month DayofWeek Year
可以使用复杂符号:
* 表示任意
? 只能用在DayofMonth和DayofWeek,也表示任意当写法如下13 13 15 20 * ?这里最后就要用?号
- 表示范围 5-20
/ 表示从起始时间开始触发,然后每隔固定时间触发一次 5/20 起始5,间隔20
, 表示枚举 5,20
L表示最后.只能用在DayofMonth和DayofWeek
W 表示有效工作日,只能出现在DayofMonth
LW 表示每个月的最后一个工作日
# 表示某个月的第几个星期几 4#5
3.调度器由Scheduler接口体现
/**
* 作业
* @author Administrator
*
*/
public class TestJob implements Job{
private static int count = 0;
private boolean isRunning = false;
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// TODO Auto-generated method stub
if(!isRunning){
count++;
System.out.println(new Date()+"作业"+count+"被调度");
for(int i=0;i<100;i++){
System.out.println("作业完成"+(i+1)+"%");
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println(new Date()+"作业调度完成");
}
else{
System.out.println(new Date()+"任务退出");
}
}
}
/**
* 调度器
* @author Administrator
*
*/
public class MyQuartzServer {
public static void main(String[] args){
try {
new MyQuartzServer().startScheduler();
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void startScheduler() throws SchedulerException{
//调度器实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//以TestJob创建JobDetail
JobDetailImpl jobDetail = new JobDetailImpl("dd",Scheduler.DEFAULT_GROUP,TestJob.class);
//触发器
Trigger trigger = new SimpleTriggerImpl("dd",Scheduler.DEFAULT_GROUP,5000,200);
//绑定触发器和Detail
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
}
}
现在将其应用到Spring中
1.创建作业有两个方法
1-1.继承QuartzJobBean
先
继承抽象类QuartzJobBean
再配置
<bean name="quartzDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="QuartzJobBean子类"></property>
</bean>
1-2.利用MethodInvokingJobDetailFactoryBean工厂Bean包装普通java对象,无需继承任何父类,直接配置即可使用
<bean id="testQuarz" class="XX.TestQuartz"/>
<bean id="quartzDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testQuartz"/><!--目标类-->
<property name="targetMethod" value="test"/><!--目标类方法-->
</bean>
定义完bean后
2.定义触发器SimplieTriggerBean或CronTriggerBean
3.使用SchedulerFactoryBean调度
public class PayJob extends QuartzJobBean{
private boolean isRunning = false;
private EmpManager em;
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
if(!isRunning){
System.out.println("开始打卡");
isRunning = true;
em.autoPunch();
isRunning = false;
}
}
public EmpManager getEm() {
return em;
}
public void setEm(EmpManager em) {
this.em = em;
}
}
<!-- Quartz2 -->
<!-- 定义触发器 -->
<bean id="cronTriggerPunch" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- Detail -->
<property name="jobDetail">
<bean class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.fox.wf.scheduler.PunchJob"></property>
<property name="jobDataAsMap">
<map><entry key="em" value-ref="empManager"></entry></map>
</property>
</bean>
</property>
<!-- time -->
<property name="cronExpression" value="0 0 7,12 ? * MON-FRI"></property>
</bean>
<bean id="cronTriggerPay" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- Detail -->
<property name="jobDetail">
<bean class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.fox.wf.scheduler.PayJob"></property>
<property name="jobDataAsMap">
<map><entry key="em" value-ref="empManager"></entry></map>
</property>
</bean>
</property>
<!-- time -->
<property name="cronExpression" value="0 0 2 3 * ? *"></property>
</bean>
<!-- 作业调度 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="cronTriggerPunch"></ref>
<ref local="cronTriggerPay"></ref>
</list>
</property>
</bean>