Quartz的使用前准备:
1.引入必要的jar包:
- quartz_all_xxx.jar 或者quartz_xxx.jar
- slf4j_api_xx.jar quartz所需要的日志工具
quartz知识简单了解: 2.quartz的两种作业存储方式:
- RAMJobStore,利用内存来持久化调度程序信息
- JDBC作业存储,利用JDBC驱动和后台库中保存的调度程序信息
3.Quartz两种触发器
- simpleTrigger 适合执行简单的调度任务
- cronTrigger 使用cron表达式,调度相对复杂的任务
4.quartz调度器—将任务和触发器关联起来。 由scheduler接口体现,该接口主要定义了三个方法:
- void addJob(JobDetail jobDetail, Boolean replace)
- Date scheduleJob(JobDetail jobDetail, Trigger trigger) //使用trigger类控制该job
- Date scheduleJob(Trigger trigger) //添加触发器调度作业
在spring中使用quartz,创建quartz作业bean的两种方法: 1.使用JobDetailBean包装QuartzBean子类的实例
- 创建一个Quartz的作业bean,但是这个bean必须要继承QuartzJobBean抽象类,其中要实现一个executeInternal(JobExecutionContext ctx)方法。
2.使用MethodInvokingJobDetailFactoryBean配置方法(如下例Spring-action.xml 配置)
3.Spring-action.xml 配置内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<!-- lang: xml --> <!--quartz demo test start--> <!-- 定义要定时工作bean 并将任务工程注入 --> <bean id="quarzDemo" class="com.pgw.util.QuarzDemo" > <property name="scheduler" ref="schedulerFactory" /> </bean> <!-- 将testQuarzt注入到job中 --> <bean id="testJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- targetObject 为要定时调用的工作bean --> <property name="targetObject" ref="quarzDemo" /> <!-- targetMethod 为targetObject中要触发的方法名 --> <property name="targetMethod" value="doSomething" /> </bean> <!-- 将job注入到定时触发器 --> <bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <!-- 上边定义好的job Bean注入到触发器中 --> <property name="jobDetail" ref="testJob" /> <!-- cron表达式,定义要触发的时间 --> <property name="cronExpression"> <value>0 56 10 * * ?</value> </property> </bean> <!-- 将触发器注入任务工程 --> <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" autowire="no"> <property name="triggers"> <list> <!-- 任务工程中要触发的触发器列表 --> <ref local="testTrigger" /> </list> </property> </bean> <!-- 动态填入cron表单式的界面action bean --> <bean id="quartzAction" class="com.pgw.action.QuartzAction"> <property name="quarzDemo" ref="quarzDemo"></property> </bean> <!--quartz demo test end --> </beans> |
QuarzDemo类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<!-- lang: java --> public class QuarzDemo{ private Scheduler scheduler; publicvoid doSomething() { System.out.println("Hello World !!!"); } publicvoid resetJob(String cronExpression){ try { // 运行时可通过动态注入的scheduler得到trigger, // 注意采用这种注入方式在有的项目中会有问题,如果遇到注入问题, // 可以采取在运行方法时候,获得bean来避免错误发生。 CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("testTrigger", Scheduler.DEFAULT_GROUP); String originConExpression = trigger.getCronExpression(); // 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob if (!originConExpression.equalsIgnoreCase(cronExpression)) { trigger.setCronExpression(cronExpression); scheduler.rescheduleJob("testTrigger", Scheduler.DEFAULT_GROUP, trigger); } } catch (SchedulerException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } publicvoid setScheduler(Scheduler scheduler) { this.scheduler = scheduler; } public Scheduler getScheduler() { returnscheduler; } } |
注意:
1.lazy-init如果设置为true,这任务工程在服务器启动时不会加载。所以这里必须设置为false。
2.由于在上边的配置中定义的了default-autowire=”byName”, Spring会自动注入quartz中的datasource bean,所以会报异常。
解决方法:在bean中关掉autowired