配置: 需要在spring中加入的包 quartz-all-1.6.0.jar,commons-collections.jar ===============================华丽的分割线=========================== 1、加入需要执行worker类
Ps : 一个普通的bean ===============================华丽的分割线=========================== 2、在Quartz中注入worker类和需要执行的方法
Ps: targetObject : 目标对象,即worker类 targetMethod :目标方法,需要执行的目标方法,必须是无参方法 concurrent : 同步。 Q&A Q: 执行的方法必须是无参方法,如何传递参数? A:在Spring中注入参数 eg :
Q:concurrent具体什么意思? A:指定concurrent设为false,多个线程不会并发运行,第二个线程将不会在第一个线程完成之前开始。 ===============================华丽的分割线=========================== |
3、配置时间触发器
Ps: jobDetail :要触发的Quartz cronExpression:触发周期 Q&A Q:cronExpression怎么配置? A:每一位的含义 秒(0-59 可用符号:, - * /) 分(0-59 可用符号:, - * /) 小时(0-23 可用符号:, - * /) 日(1-31 可用符号:, - * / ?) 月(1-12 可用符号:, - * /) 周(1-7 可用符号:, - * / ?) 年(1970-2099 可选 可用符号:, - * /) 字符的含义 *:表示所有值 ?: 表示不关心该位的值 -:范围,如:在周的位置使用1-7 相当于* ,:表示指定的某些值,如:在周的位置使用1,3,5表示在周一,周三,周五触发 /:表示每次递增,如:在秒的位置使用 0/5 表示在0秒触发,每个5秒触发一次 eg : 每隔5秒触发一次
每天10点30分25秒触发一次
每周一三五晚十点触发一次
=============================== 华丽的分割线 ========================== |
4、配置触发任务
<bean id="testScheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="testTrigger"/>
</list>
</property>
<property name="autoStartup"value="true"/>
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.threadCount">1</prop>
</props>
</property>
</bean>
Ps:
triggers:注入定时器任务,可以为多个
autoStartup:系统启动时自动启动,可以不配置,默认为true
quartzProperties:Quartz其他配置 org.quartz.threadPool.threadCount可以不配,默认为10
Q&A
Q:当autoStartup设置为false时怎么启动?
A:如果需要手动启动Scheduler则需要获得Quartz中的stdScheduler对象,调用该对象的start方法启动,shutdown方法关闭。
要取得stdScheduler对象要配置Map对象来保存stdScheduler对象即可
eg:
Xml :
<bean name="schedulerMap"class="java.util.HashMap">
<constructor-arg>
<map>
<entry key="testScheduler"value-ref="testScheduler"/>
</map>
</constructor-arg>
</bean>
Code :
Map<String, StdScheduler> scheMap = (Map<String, StdScheduler>) context.getBean("schedulerMap");
StdScheduler std = scheMap.get("testScheduler");
System.out.println("wait 3 second to start");
Thread.sleep(3000);
std.start();
System.out.println("30 seconds shutdown after");
for (int i = 30; i >= 1; i--) {
Thread.sleep(1000);
System.out.println("countdown : " + i);
}
std.shutdown();
System.out.println("worker is stop..");