Quartz
1、导入jar包
2、写一个POJO,也就是一个普通java类,方法名任意
public class MyJob { public void send() { System.out.println("任务执行完成了:"+new Date()); } }
3、配置一下此POJO的bean以及调度Quartz和spring整合的bean
<!-- 定义一个任务 --> <bean id="myJob" class="com.cb.job.MyJob"></bean> <!-- 定义一个MethodInvoingJobDetailFactoryBean --> <bean id="methodInvokingJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="myJob"></property> <property name="targetMethod" value="send"></property> </bean> <!-- 指定时间 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="methodInvokingJob"></property> <property name="cronExpression" value="0/1 * * * * ? *"></property> </bean> <!-- 指定一个总调度器 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"></ref> </list> </property> </bean>
配置说明:
1、org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类为指定哪个pojo为调度类,此类中哪个方法需要执行,这些都通过属性注入:
<property name="targetObject" ref="myJob"></property>,targetObject为指定哪个bean为调度类
<property name="targetMethod" value="send"></property>,为指定此POJO中哪个方法需要进行调度
2、org.springframework.scheduling.quartz.CronTriggerFactoryBean配置调度执行时机,一般是通过指定表达式来决定
<property name="jobDetail" ref="methodInvokingJob"></property>,为指定需要配置哪个调度
<property name="cronExpression" value="0/1 * * * * ? *"></property>,为配置调度触发的表达式,依次是 秒 分 钟 时 日 月 周 年 ,反正周和日两个不能同时为*,得有一个为?,这个框架这么规定的
3、org.springframework.scheduling.quartz.SchedulerFactoryBean类为总的触发调度器,其可以配置多个调度,通过list集合注入,可以配置多个任务
<list> <ref bean="cronTrigger"></ref> </list>
quartz组件的难点就是在调度时间配置上,采用cron表达式,配置详解如下:
cron表达式由7个部分构成:由年周月日时分秒这个7个单位构成,最前面是秒,依次类推,个单位之间以空格隔开,其中年为非必须构成,其他6个是必须的,如* 30 17 * * ?代表每天17点30分触发一次调度,其中?号只能日和周,与* 一样代表任意 |
同一单位触发两次以逗号分割,如 * 10,20 * * * ?代表每第10分钟和第20分钟的时候触发一次 ,是一个或的意思 |
斜杠/代表递增,如0/5 代表从0开始,每5秒触发一次 |
-代表范围,如3-8代表3,4,5,6,7,8秒触发依次,只能3-8顺序执行,不能8-3倒叙执行,跟时钟摆针一样,只能正着走,不能倒着走 |
字母L只能放在日和周上,代表最后,放在日上代表在本月的最后一天,放周上其实也就是周六,周是从周日1-周六7结束 |
W代表工作日,只能用在日上,如果刚好是周六日,那么以最近的上下浮动一天到工作日,如周六的话,就提前到周五,如果周日的话,那么顺延到周一上班再触发 |
如果不懂表达式的话,可以到网上用cron在线生成器自动来生成
http://cron.qqe2.com/