Quartz的使用前准备:java
1.引入必要的jar包:spring
quartz知识简单了解: 2.quartz的两种做业存储方式:数据库
3.Quartz两种触发器api
4.quartz调度器—将任务和触发器关联起来。 由scheduler接口体现,该接口主要定义了三个方法:服务器
在spring中使用quartz,建立quartz做业bean的两种方法: 1.使用JobDetailBean包装QuartzBean子类的实例工具
2.使用MethodInvokingJobDetailFactoryBean配置方法(以下例Spring-action.xml 配置)this
3.Spring-action.xml 配置内容:日志
<!-- 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类code
<!-- 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; } }
注意:xml
1.lazy-init若是设置为true,这任务工程在服务器启动时不会加载。因此这里必须设置为false。
2.因为在上边的配置中定义的了default-autowire="byName", Spring会自动注入quartz中的datasource bean,因此会报异常。 解决方法:在bean中关掉autowired