各位程序员们,你们好;
Java中常用的定时器有两个,一个是java自带的Timer,还有一个就是 quartz;
这里我简单给大家讲一个我在项目中的Quartz定时器,以及遇到的问题。
1.环境
该项目使用Maven进行管理,所以我们只需要在POM文件中引入jar包就可以了;注:我用的是Spring 3.2的jar
Code:
<!-- quartz jar -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.1.7</version>
</dependency>
2.Java 自定一个定时器类
自定义定时器的写法有两种,我这个先写一种,另外一种可以单独联系我,我们探讨一下;
Code:
package com.shi.test;
import org.apache.log4j.Logger;
public class TimerManager {
private static Logger debuger = Logger.getLogger(TimerManager.class);
private static int i =0;
public void work() {
System.out.println("---shi.yu----"+(i++));
debuger.info("Quarze 定时器");
}
}
3.将自定义的定时器加入Spring,以及配置Spring.xml文件
<!-- 定时器 要调用的工作类 -->
<bean id="quartzJob" class=" com.shi.test.TimerManager "></bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="myjob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="quartzJob" />
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>work</value>
</property>
</bean>
<!-- 定义触发时间 -->
<bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="myjob" />
</property>
<!-- cron表达式 -->
<property name="cronExpression">
<value>0 0 23 * * ?</value>
</property>
</bean>
<!-- 总管理类 如果将lazy-init='false' 那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="doTime" />
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.instanceName">qmsQuartzScheduler</prop>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">1</prop>
<prop key="org.quartz.threadPool.threadPriority">5</prop>
</props>
</property>
</bean>
配置文件解析:
<bean id="quartzJob" class=" com.shi.test.TimerManager "></bean>
将所需要执行的定时器注入到Spring中
<bean id="myjob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="quartzJob" />
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>work</value>
</property>
</bean>
调用 org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean 这个类,并将一些参数配置进去,
<property name="targetObject">
<ref bean="quartzJob" />
</property>
这个指你需要执行的定时器类
<property name="targetMethod">
<value>work</value>
</property>
这个指 你需要执行定时器类中的特定的类
org.springframework.scheduling.quartz.CronTriggerFactoryBean在该类中需要配置 执行的时间 一般使用cronExpression 进行配置;
cronExpression 写法:
顺序 秒 分钟 小时 日 月 周 年
序号 | 说明 | 是否必填 | 允许填写的值 | 允许的通配符 |
1 | 秒 | 是 | 0-59 | , - * / |
2 | 分 | 是 | 0-59 | , - * / |
3 | 小时 | 是 | 0-23 | , - * / |
4 | 日 | 是 | 1-31 | , - * ? / L W |
5 | 月 | 是 | 1-12 or JAN-DEC | , - * / |
6 | 周 | 是 | 1-7 or SUN-SAT | , - * ? / L # |
7 | 年 | 否 | empty 或 1970-2099 | , - * / |
特殊字符: * 表示每一秒 每一份 每一天........
/number 表示每number小时 每number分 每number秒 ......
如果说你需要配置一个每天18点执行的程序 ,你的秒 分 字段中数值需要为0,若为* 号 他会从18点开始 每一秒度执行一次该方法
对应 定时器的线程池我们可以再 org.springframework.scheduling.quartz.SchedulerFactoryBean