且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Java定时器(二)之Spring定时任务、Quartz实现

更新时间:2022-04-12 07:52:32

Java定时器(二)之Spring定时任务、Quartz实现

Java定时器(二)之Spring定时任务、Quartz实现

  • spring定时器(基于xml)
  • spring定时器(基于注解)
  • quartz定时器
 
1、使用基于xml配置的spring定时器
首先编写定时任务类Mytask

[java] view plain copy

  1. public class Mytask {
  2.   public void execute(){
  3.   System.out.println("基于xml配置的spring定时任务!");
  4.  }
  5. }
接着在spring配置文件中加入xmlns:task="http://www.springframework.org/schema/task"命名空间

[html] view plain copy

  1. <task:annotation-driven/>
  2. <bean id="mytask" class="com.pptv.vipbackend.controller.Mytask"/>
  3. <task:scheduled-tasks>
  4. <task:scheduled ref="mytask" cron="*/5 * * * * ?" method="print"/><!--每隔5秒执行一次-->
  5. </task:scheduled-tasks>
当然,定时任务类要加入spring的管理中

[html] view plain copy

  1. <context:component-scan base-package="com.simonsfan.study.controller.Mytask">
执行便可看到效果
 
2、使用基于注解配置的spring定时器
基于注解会相对简单的多,直接编写任务类Mytask:

[java] view plain copy

  1. @EnableScheduling
  2. @Component
  3. public class Mytask {
  4.   @Scheduled(cron = "*/5 * * * * ?")
  5.   public void execute(){
  6.     System.out.println("基于注解配置的spring定时任务!");
  7.   }
  8. }
当然,任务类也要纳入spring管理

[html] view plain copy

  1. <context:component-scan base-package="com.simonsfan.study.controller.Mytask">
  2. <task:annotation-driven/>
启动可以看到相同效果
 
3、quartz定时器,其性能和灵活性都优于jdk的TimerTask类
pom文件中加入

[html] view plain copy

  1. <dependency>
  2. <groupId>org.quartz-scheduler</groupId>
  3. <artifactId>quartz</artifactId>
  4. <version>2.2.2</version>
  5. </dependency>
 
定时任务类Mytask:

[java] view plain copy

  1. @Component
  2. public class Mytask {
  3.   public void execute() {
  4.     System.out.println("基于spring+quartz实现定时任务!");;
  5.   }
  6. }
spring配置文件中加入:

[html] view plain copy

  1. <bean id="jobBean" class="com.pptv.vipbackend.controller.Mytask"/>
  2. <bean id="myJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  3. <property name="targetObject">
  4. <ref bean="jobBean"/>
  5. </property>
  6. <property name="targetMethod">
  7. <value>execute</value><!--任务类中的方法名-->
  8. </property>
  9. <!--将并发设置为false-->
  10. <property name="concurrent" value="false" />
  11. </bean>
  12. <bean id="simpleTrigger"
  13. class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
  14. <property name="jobDetail" ref="myJobDetail" />
  15. <property name="startDelay" value="1000" />
  16. <property name="repeatInterval" value="2000" />
  17. </bean>
  18. <!-- 总管理类如果将lazy-init='false'那么容器启动就会执行调度程序 -->
  19. <bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" autowire="no">
  20. <property name="triggers">
  21. <list>
  22. <!--作业调度器,list下可加入其他的调度器-->
  23. <ref bean="simpleTrigger" />
  24. </list>
  25. </property>
  26. </bean>
这样,基于spring + quartz便可实现定时任务的调度
 
定时任务中的时间表达式:
顺序: 分钟 小时 日期 月份 星期 年(可选)
取值: 0-59 0-59 0-23 1-30(31) 1-12 1-7  
允许特殊字符: , - * / , - * / , - * / , - * / ? L W C , - * / , - * / L # C 1970-2099 , - * /
字段含义

[html] view plain copy

  1. *:代表所有可能的值
  2. -:指定范围
  3. ,:列出枚举  例如在分钟里,"5,15"表示5分钟和20分钟触发
  4. /:指定增量  例如在分钟里,"3/15"表示从3分钟开始,没隔15分钟执行一次
  5. ?:表示没有具体的值,使用?要注意冲突
  6. L:表示last,例如星期中表示7或SAT,月份中表示最后一天31或30,6L表示这个月倒数第6天,FRIL表示这个月的最后一个星期五
  7. W:只能用在月份中,表示最接近指定天的工作日
  8. #:只能用在星期中,表示这个月的第几个周几,例如6#3表示这个月的第3个周五
  9. 0 * * * * ? 每1分钟触发一次
  10. 0 0 * * * ? 每天每1小时触发一次
  11. 0 0 10 * * ? 每天10点触发一次
  12. 0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
  13. 0 30 9 1 * ? 每月1号上午9点半
  14. 0 15 10 15 * ? 每月15日上午10:15触发
  15. */5 * * * * ? 每隔5秒执行一次
  16. 0 */1 * * * ? 每隔1分钟执行一次
  17. 0 0 5-15 * * ? 每天5-15点整点触发
  18. 0 0/3 * * * ? 每三分钟触发一次