精华内容
下载资源
问答
  • java 定时任务之一 @Scheduled注解(第一种方法)

    万次阅读 多人点赞 2017-12-12 22:09:22
    使用spring @Scheduled注解执行定时任务: 步骤: 1.xmlns 添加: http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd xmlns:task=...

    (本文仅供参考)

    使用spring @Scheduled注解执行定时任务:

     

    步骤:

    1.xmlns 添加

    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task-3.1.xsd
    xmlns:task="http://www.springframework.org/schema/task"

    2.注入:

    <task:annotation-driven/>

    3.注解写在实现类的方法上,实现类上要有组件的注解@Component

    @Scheduled(cron="0/5 * *  * * ? ")   //每5秒执行一次

    运行即可!!!


    关于Cron表达式介绍

    cronExpression定义时间规则,Cron表达式由6或7个空格分隔的时间字段组成:秒 分钟 小时 日期 月份 星期 年(可选)

    字段  允许值  允许的特殊字符 
    秒       0-59     , - * / 
    分       0-59     , - * / 
    小时      0-23     , - * / 
    日期      1-31     , - * ? / L W C 
    月份      1-12     , - * / 
    星期      1-7       , - * ? / L C # 
    年     1970-2099   , - * /

    “*”字符被用来指定所有的值。

    如:

    "*":字符在分钟的字段域里表示“每分钟”。 
    “?”:字符只在日期域和星期域中使用。它被用来指定“非明确的值”。

    当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。看下面的例子你就会明白。 
    月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号来表明不想设置那个字段。

    “-”:字符被用来指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”。

    “,”:字符被用来指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”。

    “/”:字符用于指定增量。

    如:“0/15”在秒域意思是每分钟的0,15,30和45秒。

    “5/15”在分钟域表示每小时的5,20,35和50。

    符号“*”在“/”前面(如:*/10)等价于0在“/”前面(如:0/10)。

    记住一条本质:表达式的每个数值域都是一个有最大值和最小值的集合,如:

    秒域和分钟域的集合是0-59,日期域是1-31,月份域是1-12。字符“/”可以帮助你在每个字符域中取相应的数值。如:“7/6”在月份域的时候只 有当7月的时候才会触发,并不是表示每个6月。

    L是‘last’的省略写法可以表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of- month域中表示一个月的最后一天。如果在day-of-week域表示‘7’或者‘SAT’,如果在day-of-week域中前面加上数字,它表示 一个月的最后几天,例如‘6L’就表示一个月的最后一个星期五。

    字符“W”只允许日期域出现。这个字符用于指定日期的最近工作日。例如:如果你在日期域中写 “15W”,表示:这个月15号最近的工作日。所以,如果15号是周六,则任务会在14号触发。如果15好是周日,则任务会在周一也就是16号触发。如果 是在日期域填写“1W”即使1号是周六,那么任务也只会在下周一,也就是3号触发,“W”字符指定的最近工作日是不能够跨月份的。字符“W”只能配合一个 单独的数值使用,不能够是一个数字段,如:1-15W是错误的。

    “L”和“W”可以在日期域中联合使用,LW表示这个月最后一周的工作日。

    字符“#”只允许在星期域中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周)。“2#1”表示本月第一周的星期一。“4#5”表示第五周的星期三。

    字符“C”允许在日期域和星期域出现。这个字符依靠一个指定的“日历”。也就是说这个表达式的值依赖于相关的“日历”的计算结果,如果没有“日历” 关联,则等价于所有包含的“日历”。如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后5天。星期域是“1C”表示关联“日历” 中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)。

    例子如下:

    0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
    0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
    0 0 12 ? * WED 表示每个星期三中午12点 
    "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触发

    关于Cron表达式的介绍来源:

    http://blog.csdn.net/supingemail/article/details/22274279

    表达式网站生成:

    http://cron.qqe2.com/  直接点击

     

     

     

    展开全文
  • spring定时任务详解(@Scheduled注解)

    万次阅读 多人点赞 2016-07-07 17:09:36
    import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.mvc.task.IATask; @Component public class ATask implements IATask{ @Scheduled...

    在springMVC里使用spring的定时任务非常的简单,如下:

    (一)在xml里加入task的命名空间

    xmlns:task="http://www.springframework.org/schema/task" 
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd

    (二)启用注解驱动的定时任务

    <task:annotation-driven scheduler="myScheduler"/> 
    

    (三)配置定时任务的线程池

    推荐配置线程池,若不配置多任务下会有问题。后面会详细说明单线程的问题。

    <task:scheduler id="myScheduler" pool-size="5"/>

    (四)写我们的定时任务

    @Scheduled注解为定时任务,cron表达式里写执行的时机

    package com.mvc.task.impl;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.concurrent.TimeUnit;
    import org.joda.time.DateTime;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    import com.mvc.task.IATask;
    @Component
    public class ATask implements IATask{
           @Scheduled(cron="0/10 * *  * * ? ")   //每10秒执行一次    
           @Override    
           public void aTask(){    
                try {
                    TimeUnit.SECONDS.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
                System.out.println(sdf.format(DateTime.now().toDate())+"*********A任务每10秒执行一次进入测试");    
           }    
    }  
    package com.mvc.task.impl;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import org.joda.time.DateTime;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    import com.mvc.task.IBTask;
    @Component
    public class BTask implements IBTask{
    	   @Scheduled(cron="0/5 * *  * * ? ")   //每5秒执行一次    
    	   @Override 
    	   public void bTask(){   
    		     DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    	         System.out.println(sdf.format(DateTime.now().toDate())+"*********B任务每5秒执行一次进入测试");    
    	   }    
    }

    spring的定时任务默认是单线程多个任务执行起来时间会有问题(B任务会因为A任务执行起来需要20S而被延后20S执行),如下图所示:



    当我们配置了线程池后再来看结果(多线程下,B任务再也不会因为A任务执行起来要20S而被延后了):

    cron表达式详解:    

    一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。

           按顺序依次为
          1  秒(0~59)
          2  分钟(0~59)
          3 小时(0~23)
          4  天(0~31)
          5 月(0~11)
          6  星期(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
          7.年份(1970-2099)
          其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?.
           0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
           0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
           0 0 12 ? * WED 表示每个星期三中午12点
           "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触发
           有些子表达式能包含一些范围或列表
           例如:子表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”
           “*”字符代表所有可能的值
           “/”字符用来指定数值的增量
           例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
                    在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样
           “?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值
           当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
           “L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写
           如果在“L”前有具体的内容,它就具有其他的含义了。例如:“6L”表示这个月的倒数第6天
           注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题
           W 字符代表着平日(Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。
           例如,日域中的 15W 意味着 "离该月15号的最近一个平日。" 假如15号是星期六,那么 trigger 会在14号(星期五)触发,因为星期四比星期一离15号更近。
           C:代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。
           字段   允许值   允许的特殊字符
           秒           0-59           , - * /
           分           0-59           , - * /
           小时           0-23           , - * /
           日期           1-31           , - * ? / L W C
           月份           1-12 或者 JAN-DEC           , - * /
           星期           1-7 或者 SUN-SAT           , - * ? / L C #
           年(可选)           留空, 1970-2099           , - * /

    展开全文
  • @Scheduled

    2020-08-03 16:13:32
    每隔5秒执行一次: @Scheduled(cron = "*/5 * * * * ?") 每隔1分钟执行一次: @Scheduled(cron = "0 */1 * * * ?") 每天23点执行一次: @Scheduled(cron = "0 0 23 * * ?") 每天凌晨1点执行一次: @Scheduled(cron =...
    
    
    每隔5秒执行一次:            @Scheduled(cron = "*/5 * * * * ?")
    每隔1分钟执行一次:           @Scheduled(cron = "0 */1 * * * ?")
    每天23点执行一次:           @Scheduled(cron = "0 0 23 * * ?")
    每天凌晨1点执行一次:          @Scheduled(cron = "0 0 1 * * ?")
    每月1号凌晨1点执行一次:      @Scheduled(cron = "0 0 1 1 * ?")
    每月最后一天23点执行一次:     @Scheduled(cron = "0 0 23 L * ?")
    每周星期天凌晨1点实行一次:     @Scheduled(cron = "0 0 1 ? * L")26分、29分、33分执行一次:     @Scheduled(cron = " 0 26,29,33 * * * ?")
    每天的0点、13点、18点、21点都执行一次:  @Scheduled(cron = " 0 0 0,13,18,21 * * ?")
    
       
    
    展开全文
  • 主要介绍了spring-boot通过@Scheduled配置定时任务,文中还给大家介绍了springboot 定时任务@Scheduled注解的方法,需要的朋友可以参考下
  • 问题1 之前定时任务一致好好的,某天突然服务没有执行,重启之后也不执行,本地起服务也不执行。。。。 ...问题2 加了@EnableScheduling 定时器还是不管用 解决方法 ...@Scheduled 定时任务慢,明明时间设...

    问题1
    之前定时任务一致好好的,某天突然服务没有执行,重启之后也不执行,本地起服务也不执行。。。。
    解决方法 https://blog.csdn.net/weixin_37882382/article/details/82217729
    问题2
    加了@EnableScheduling 定时器还是不管用
    解决方法
    定时任务类没有加

    @Service
    

    问题3
    @Scheduled 定时任务慢,明明时间设置的很快,但是执行很慢
    解决方法
    @Scheduled 默认是一个线程执行的
    以上所有解决代码
    @EnableScheduling加载启动类上(注意一个应用只加一个@EnableScheduling注解,多了会报错)

    package com.drips.config;
    
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledThreadPoolExecutor;
    import java.util.concurrent.ThreadFactory;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    
    /**
     * 
     * @author 易通
     * @date 2018/11/28
     * 定时任务配置
     */
    @Configuration
    public class SchedulingConfiguration implements SchedulingConfigurer{
    
    	@Override
    	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    		
    		//默认是一个线程
    		taskRegistrar.setScheduler(Executors.newScheduledThreadPool(3000));
    		// TODO Auto-generated method stub
    		taskRegistrar.setScheduler(new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),
                    new ThreadFactory() {
                        @Override
                        public Thread newThread(Runnable r) {
                            return new Thread(r,"my-schedule");
                        }
                    }));
    	}
    }
    
    package com.drips.config;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Service;
    
    /**
     * 
     * @author 易通
     * @date 2018/11/28
     * 定时任务测试
     */
    @Service
    public class ScheduledTasks {
    	private static final Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
    	private static final SimpleDateFormat dataFromat = new SimpleDateFormat("HH:mm:ss");
    	@Scheduled(fixedDelay=2)
    	public void phoneWorktask() {
    		logger.info("定时任务开始时间", dataFromat.format(new Date()));
    		for (int i = 0; i < 100; i++) {
    			logger.info("第一个线程--"+i);
    			try {
    				Thread.sleep(500);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		logger.info("定时任务结束时间", dataFromat.format(new Date()));
    	}
    	@Scheduled(fixedDelay=2)
    	public void phoneWorktask1() {
    		logger.info("定时任务开始时间", dataFromat.format(new Date()));
    		for (int i = 0; i < 100; i++) {
    			logger.info("第二个线程----"+i);
    			try {
    				Thread.sleep(500);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		logger.info("定时任务结束时间", dataFromat.format(new Date()));
    	}
    	@Scheduled(fixedRate=2)
    	public void phoneWorktask2() {
    		logger.info("定时任务开始时间", dataFromat.format(new Date()));
    		for (int i = 0; i < 100; i++) {
    			logger.info("第四个线程---->>>"+i);
    			try {
    				Thread.sleep(500);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		logger.info("定时任务结束时间", dataFromat.format(new Date()));
    	}
    	@Scheduled(cron = "0 * * * * ?")
    	public void phoneWorktask3() {
    		logger.info("定时任务开始时间", dataFromat.format(new Date()));
    		for (int i = 0; i < 100; i++) {
    			logger.info("第三个线程                  ------"+i);
    			try {
    				Thread.sleep(500);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		logger.info("定时任务结束时间", dataFromat.format(new Date()));
    	}
    }
    
    
    展开全文
  • 出现这个错误主要是@Scheduled注解下的方法带有参数,把@Scheduled注解下的方法的参数去掉就可以了
  • @Scheduled 定时器

    2020-03-26 11:48:24
    @Scheduled 定时任务总结 @Scheduled 作用:spring定时器(定时执行一次或定时轮询执行一段代码) 使用场景:注解在方法上 参数说明:常用参数 一、@Scheduled 参数说明 1、Long fixedDelay:定时任务每隔多久...
  • 定时任务@Scheduled注解用法 使用spring @Scheduled注解执行定时任务:
  • spring的定时任务@Scheduled简单实用

    万次阅读 多人点赞 2019-05-05 23:05:41
    方式一:使用注解 @Component @EnableScheduling//可以在启动类上注解也可以在当前文件 ... @Scheduled(cron = "0/10 * * * * ?") public void runfirst(){ System.out.println("********first job is ...
  • @Scheduled笔记

    2019-09-12 15:19:16
    @Scheduled笔记 spring提供的定时任务注解,使用方便,简记一下具体实现 1.首先要在项目中添加@EnableScheduling注解,启用一下 2.在需要执行的方法上添加@Scheduled注解 完成以上两步,任务就配置好了. 接下来看一下,...
  • Spring @Scheduled 定时任务详解一 什么是@Scheduled二 怎么使用@Scheduled2.1 启动类上加@EnableScheduling2.2 编写配置类 定时任务2.3 启动项目2.4 执行结果三 @Scheduled 三种配置方法3.1 cron 表达式3.2 ...
  • spring @Scheduled定时任务代码
  • Encountered invalid @Scheduled method ‘setTimeAgain’: For input string: ""En 加上下边这个就Ok了 @Bean public TaskScheduler scheduledExecutorService() { ThreadPoolTaskScheduler scheduler = new ...
  • SpringBoot定时任务@Scheduled注解详解

    千次阅读 2021-03-01 19:53:20
    SpringBoot定时任务@Scheduled注解详解 项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发 概述 要使用@Scheduled注解,首先需要在启动类添加@EnableScheduling,启用...
  • Springboot定时任务@Scheduled详解一、使用的注解: @Scheduled 和 @EnableScheduling@EnableScheduling@Scheduled注解标识任务修改@Scheculed默认线程池为多线程二、只使用的注解: @Scheduled 不用 @...
  • Spring中的@Scheduled

    万次阅读 2019-05-16 00:54:56
    @Scheduled 由Spring定义,用于将方法设置为调度任务。如:方法每隔十秒钟被执行、方法在固定时间点被执行等 @Scheduled(fixedDelay = 1000) 上一个任务结束到下一个任务开始的时间间隔为固定的1秒,任务的执行...
  • Spring自定义@Scheduled

    2020-06-16 21:27:15
    如果想让定时任务分到同一个包里,根据执行参数来控制是否执行,可以自定义个@Scheduled. 1.写个接口命名为MyScheduled,内容参照@Scheduled接口 @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @...
  • Spring @Scheduled

    2019-06-03 18:22:32
    Spring @Scheduled 通过@Scheduled实现任务调度有两种方式,一直是XML配置方式,一种是注解方式,下面分别是两种方式的示例。 1.XML配置方式 BookApp.java import org.springframework.scheduling.annotation....
  • SpringBoot原理--@Scheduled

    2021-01-20 11:24:12
    其他网址 ...springBoot中@Scheduled执行原理解析_gaodebao1的博客-CSDN博客Spring @Scheduled执行原理解析 · Issue #27 · TFdream/blog · GitHubSpringBoot 中 @Scheduled 的执行原理 | 七墨博客
  • @scheduled注解作用

    千次阅读 2019-06-27 11:13:04
    @scheduled注解作用 用来开启定时任务 fixedRate 和 fixedDelay 的区别 fixedRate 任务两次执行时间间隔是任务的开始点,而 fixedDelay 的间隔是前次任务的结束与下次任务的开始。 @Scheduled(fixedRate = 5000) 5秒...
  • @Scheduled不执行的原因

    万次阅读 多人点赞 2016-10-18 16:17:04
    1. 今天用@Schedule做了一个定时任务,希望凌晨1点执行,代码如下@... @Scheduled(cron = "0 0 1 * * ?") public void parseMongodbDataToJson() { } } 第二天来公司了,发现根本没有执行。然后开始查找问题 2. 首先
  • spring boot @scheduled注解 cron 表达式实现计划任务调度。
  • 主要介绍了spring 定时任务@Scheduled的相关资料,文中通过示例代码介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
  • @Scheduled不生效问题

    2021-04-24 22:00:10
    @Scheduled不生效问题@Scheduled不生效问题 @Scheduled不生效问题 @Scheduled不生效的问题,断点打进去无效果。 第一反应是@EnableScheduling没有加,但是组启动类是加了的 全部配置流程和官网是几乎一模一样 最终...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,972
精华内容 24,788
关键字:

@scheduled