springd定时任务调度SchedulerFactoryBean、CronTriggerFactoryBean(简单,明了)「建议收藏」

springd定时任务调度SchedulerFactoryBean、CronTriggerFactoryBean(简单,明了)「建议收藏」http://img.blog.csdn.net/20160530121730543?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Centerok,在控制台打印一句话,每隔一秒打印一次:两步

大家好,又见面了,我是你们的朋友全栈君。

https://img-blog.csdn.net/20160530121730543?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Centerok,在控制台打印一句话,每隔一秒打印一次:

springd定时任务调度SchedulerFactoryBean、CronTriggerFactoryBean(简单,明了)「建议收藏」

两步得到上述效果:

第一步:写一个测试类MyTimeTask继承TimerTask,并实现它的run()方法;

run主体打印一句话:System.out.println(“hello:”+df.format(new Date()));

[java] 
view plain  
copy

  1. package com.yusys.service.ContractService;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import java.util.TimerTask;  
  6.   
  7. public class MyTimeTask  extends TimerTask{  
  8.     SimpleDateFormat df = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);  
  9.   
  10.     @Override  
  11.     public void run() {  
  12.         // TODO Auto-generated method stub  
  13.         System.out.println(“hello:”+df.format(new Date()));  
  14.     }  
  15.       
  16.     public static void main(String[] args) {  
  17.         /*SimpleDateFormat df = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); 
  18.         System.out.println(df.format(new Date()));*/  
  19.     }  
  20.   
  21. }  




第二步:配置applicationContext-scheduler.xml(根据实际需求,自己命名)

[html] 
view plain  
copy

  1. <?xml version=“1.0” encoding=“UTF-8”?>  
  2. <beans xmlns=“http://www.springframework.org/schema/beans”  
  3.     xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”  
  4.     xmlns:aop=“http://www.springframework.org/schema/aop”  
  5.     xmlns:tx=“http://www.springframework.org/schema/tx”  
  6.     xsi:schemaLocation=”   
  7.     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  8.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd   
  9.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd”>  
  10.       
  11.     <bean id=“myTimeTask” class=“com.yusys.service.ContractService.MyTimeTask”/>  
  12.       
  13.     <bean id=“myTimeTaskJobDetail” class=“org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean”>  
  14.         <property name=“targetObject”>  
  15.             <ref bean=“myTimeTask” />  
  16.         </property>  
  17.         <property name=“targetMethod”>  
  18.             <value>run</value>  
  19.         </property>  
  20.         <property name=“concurrent”>  
  21.             <value>false</value>  
  22.         </property>  
  23.     </bean>  
  24.     <bean id=“myTimeTaskTrigger” class=“org.springframework.scheduling.quartz.CronTriggerBean”><!–如果项目报错,把CronTriggerBean换成CronTriggerFactoryBean –>  
  25.         <property name=“jobDetail”ref=”myTimeTaskJobDetail” />
  26.    
  27.         <property name=“cronExpression” value=”0 52 10 * * ?” />  
  28.       
  29.     </bean>  
  30.       
  31.     <bean class=“org.springframework.scheduling.quartz.SchedulerFactoryBean” lazy-init=“false” autowire=“no”>  
  32.         <property name=“triggers”>  
  33.             <list>  
  34.                 <ref bean=“myTimeTaskTrigger” />  
  35.             </list>  
  36.         </property>  
  37.         <property name=“autoStartup”>  
  38.             <value>true</value>  
  39.         </property>  
  40.     </bean>  
  41. </beans>  

说明:cronExpression参数配置(注意空格)

<!– 每隔一秒钟执行一次 –>

<value>*/1 * * * * ?</value>

<!– 每隔一分钟执行一次 –>

<value>* */1 * * * ?</value>

从左到右分别是:秒,分,时,月的某天,月,星期的某天,年;其中年不是必须的,也就是说任何一个表达式最少需要六项。

springd定时任务调度SchedulerFactoryBean、CronTriggerFactoryBean(简单,明了)「建议收藏」

先看示列:”0 0/30 8-10 5,20 * ?” 表示“每个月的5日和20日的8:00,8:30,9:00,9:30,10:00,10:30”
字符解释:
,:与,表式”,”两边的值都是需要执行的时间,如上例“5,20”每个月的5日与20日
:表示值的范围,如上例“8-10”从8点开始到10结束,包括8点与10点
*:表式任意可合法的值,如上例“*”是处于月份的字段,所以代表1-12中的任意值,所以上例是指“每个月”
/:增量,如上例是指从0分开始,每过30分钟取一次值。如果换成“5/8”就是从第5钟开始每过8分钟取一次值:8:05,8:13,8:21,8:29等等
?:不指定值,就是“我也不知道”的意思,只能出现在“月的某天,星期的某天”项中。在什么情况下用呢?如上例如果指定值为星期一,那么可能会出现如4月5日不是星期一,这里就是不对应,有冲突,所以指定为”?”,也就是说我也不知道是星期几,只要是5日与20日就行了,至于是星期几我才不管呢!
L:最后的,last的意思,只能出现在“月的某天,星期的某天”项中。表示当前月或当前星期的最后一天,注意的是星期的最后一天为星期六。
W月中最接近指定日期的普通日(星期一到星期五),只能出现在“月的某天”,如”15W”就是说当前月最接近15日的普通日,如果当月的15是星期三就是星期三,如果当月的15是星期六那么就是昨天也就是星期五,如果当月的15是星期天则为第二天也就是星期一。
#:当前月的第N个星期X日,只能出现在“星期的某天”项中。如“6#3”就是说当前月的第三个星期五,注意”1-7″,1=星期天,2=星期一 等等。

(部分内容来自互联网)


  • “0 0 12 * * ?” 每天中午12点触发  
  • “0 15 10 ? * *” 每天上午10:15触发  
  • “0 15 10 * * ?” 每天上午10:15触发  
  • “0 15 10 * * ? *” 每天上午10:15触发  
  • “0 15 10 * * ? 2005” 2005年的每天上午10:15触发  
  • “0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发  
  • “0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发  
  • “0 0/5 14,18 * * ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发  
  • “0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发  
  • “0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发  
  • “0 15 10 ? * MON-FRI” 周一至周五的上午10:15触发  
  • “0 15 10 15 * ?” 每月15日上午10:15触发  
  • “0 15 10 L * ?” 每月最后一日的上午10:15触发  
  • “0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发  
  • “0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最后一个星期五上午10:15触发  
  • “0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发  



对“concurrent”设置false的深入剖析:请看下面的例子与解答,来自http://www.iteye.com/problems/54435

springd定时任务调度SchedulerFactoryBean、CronTriggerFactoryBean(简单,明了)「建议收藏」

springd定时任务调度SchedulerFactoryBean、CronTriggerFactoryBean(简单,明了)「建议收藏」




========================================华丽的分隔符=================================================

今天重新照这个写的时候发现几个问题:

①好像SpringMVC-scheduler.xml需要配置到web.xml文件中,这没有说明,我这里补充下!

建议命名的时候取统一的前缀,比如楼主的:SpringMVC-scheduler.xml,SpringMVC-DB.xml,然后在web.xml中引用的时候:

[html] 
view plain  
copy

  1. <context-param>  
  2.     <param-name>contextConfigLocation</param-name>  
  3.     <param-value>classpath:SpringMVC-*.xml</param-value>  
  4.   </context-param>  



②直接照着上面的代码复制粘贴,发现项目报错了:

Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has 

interface org.quartz.CronTrigger as super class 

springd定时任务调度SchedulerFactoryBean、CronTriggerFactoryBean(简单,明了)「建议收藏」


这个问题的解决办法是:把配置文件SpringMVC-scheduler.xml中的CronTriggerBean更换成CronTriggerFactoryBean,问题就解决了!

来自:http://www.cnblogs.com/interdrp/p/3587221.html


补充于:2016年5月30日 12:20:40




========================================华丽的分隔符=================================================

之前都是把配置放到xml里面,现在也可以使用注解的方式来跑定时任务了,一般而言不是经常变来变去的配置都可以使用注解的方式来操作quartz;


比如每隔30mins执行一次:

[java] 
view plain  
copy

  1. @Scheduled(cron = “0 */30 * * * ?”)//暂时先设置成半小时一次  


Spring的配置文件:

[html] 
view plain  
copy

  1. <description>Spring Configuration</description>  
  2.       
  3.     <context:component-scan base-package=“scheduler”/>   
  4.       
  5.     <!– 配置任务线性池 –>  
  6.     <task:executor  id=“executor” pool-size=“10” />   
  7.     <task:scheduler id=“scheduler” pool-size=“10”/>  
  8.     <task:annotation-driven scheduler=“scheduler” executor=“executor” proxy-target-class=“true”/>  




@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)


proxy-target-class=”true”

该属性值默认为false,表示使用JDK动态代理织入增强;当值为true时,表示使用CGLib动态代理织入增强;但是,即使设置为false,如果目标类没有生命接口,则spring将自动使用CGLib动态代理.(以上来自:Spring3.X企业应用开发实战 P229)

通俗理解:

当要使用实现了某个接口的类让Spring来生成bean时,无需在aop配置中添加proxy-target-class,因为它默认为false.

但如果要使用一个指定的类,让Spring来生成bean,并使用它的某个方法时,需要在aop配置上加上一句proxy-target-class=”true”,否则用JUnit时,会出现:

Java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to glut.daoImp2.DAOImp2

类似的错误.


0 */30 * * * ?和0 0/30 * * * ? 都是指的是30的倍数的时候开始执行,有的时候容易误解*/30是指,从启动开始每隔30mins执行一次,这里是个坑,哈哈;

为了验证,我用30s来试试,确实证实了都是30的倍数的时候开始执行的:

springd定时任务调度SchedulerFactoryBean、CronTriggerFactoryBean(简单,明了)「建议收藏」


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142486.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • idea永久激活码2022【中文破解版】

    (idea永久激活码2022)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.htmlLGWSVFD4PZ-eyJsaWN…

  • 单调队列初步「建议收藏」

    单调队列初步「建议收藏」
    一直弄不明白单调队列是什么,在网上也找不到易懂的介绍。最后结合别人博客上的介绍和程序看才理解是怎么回事。
    我们从最简单的问题开始:
    给定一个长度为N的整数数列a(i),i=0,1,…,N-1和窗长度k.
    要求:
         f(i)=max{a(i-k+1),a(i-k+2),…,a(i)},i=0,1,…,N-1
    问题的另一种描述就是用一个长度为k的窗在整数数列上移动,求窗里面所包含的数的最大值。
    解法一:

  • qmake实用变量[通俗易懂]

    qmake实用变量[通俗易懂]一些项目开发中用到的qmake实用变量。

  • Ubuntu20.04上安装Edge「建议收藏」

    Ubuntu20.04上安装Edge「建议收藏」原文地址:HowtoInstallMicrosoftEdgeBrowseronUbuntu20.04|Linuxizehttps://linuxize.com/post/how-to-install-edge-browser-on-ubuntu-20-04/1.更新源sudoaptupdatesudoaptinstallsoftware-properties-commonapt-transport-httpswget2.导入MicrosoftGPGKey

  • u盘拒绝访问怎么解决win11_u盘无权限访问

    u盘拒绝访问怎么解决win11_u盘无权限访问使用U盘启动盘安装系统时需要用到U盘,但是当我们将U盘插上电脑,结果出现拒绝访问的情形,别说是使用U盘启动盘重装系统了,连U盘基础的文件存储功能都无法使用。当U盘出现拒绝访问怎么解决呢?就此问题,下面小编分享u盘拒绝访问没有权限的原因和解决方法。U盘出现拒绝访问怎么解决1、U盘问题1)鼠标右键单击U盘盘符,在右键菜单中点击属性。2)在弹出的属性窗口中点击“工具”选项卡,再点击“开始检查”按钮,如下图所示:3)接着勾选“自动修复文件系统错误”和“扫描并尝试恢复坏扇区”并点击“开始”按钮(1)4)

  • 空指针引用故障(空指针解引用)「建议收藏」

    空指针引用故障(空指针解引用)「建议收藏」C语言中的指针机制使得它灵活高效,但由于指针操作不当产生的动态内存错误也有很多,比如内存泄漏(MemoryLeakage)、内存的重复释放、空指针解引用(NullPointerDereference)。其中空指针引用故障,也叫空指针解引用是一类普遍存在的内存故障,是程序设计语言中一类常见的动态内存错误。指针变量可以指向堆地址、静态变量和空地址单元。当指针指向无效内存地址时对其引用,有可能…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号