spring boot 定时任务

原创 2018年04月16日 15:23:39

好久没写了。今天搞一下spring boot 的定时任务。

定时任务顾名思义,就是定时执行。

如何使用定时任务?

使用spring boot 定时任务需要:

1、开启定时任务:在启动类添加@EnableScheduling注解。

2、创建一个被spring 管理的bean组件。在定时任务的方法上添加注解@Scheduled。

例如:

@Component
public class MailTask {
	@Scheduled(fixedRate=5000)
	public void sendMail() {
		log.info("第{}次定时发送邮件,现在时间:{}",sendMailCount++,JSONObject.toJSONStringWithDateFormat(new Date(),"yyyy-MM-dd HH:mm:ss,sss"));
	}

如何设置定时任务的定时?

定时任务的时间设置使用@Scheduled注解的几个属性来实现。

举栗:

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONObject;
import com.wm.springboot.sc.service.EmailService;

import lombok.extern.slf4j.Slf4j;

/**
 * 定时任务
 * @author maybe
 */
@Slf4j
@Component
public class MailTask {

	@Autowired
	private EmailService emailService;
	
	private int sendMailCount = 1;
	private int testCronCount = 1;
	private int testFixedRate = 1;
	private int testFixedDelay = 1;
	
	/**
	 * initialDelay第一次延迟10秒执行,后续以重星开始为时间点,延迟5秒执行。
	 * 所有时间以毫秒为单位
	 */
	@Scheduled(fixedRate=5000,initialDelay = 10000)
	public void sendMail() {
		log.info("第{}次定时发送邮件,现在时间:{}",sendMailCount++,JSONObject.toJSONStringWithDateFormat(new Date(),"yyyy-MM-dd HH:mm:ss,sss"));
//		emailService.sendMail(new Emails("240918567@qq.com", "83321164@qq.com", "测试定时任务", msgText, isEnclosure))
	}
	
	/**
	 * cron:时间表达式
	 */
	@Scheduled(cron="0/3 15-20 11,12 * * *")
	public void testCron() {
		log.info("第{}次测试cron定时任务-----",testCronCount++);
	}
	
	/**
	 * fixedRate 上一次开始执行时间点之后延迟多少秒执行
	 */
	@Scheduled(fixedRate=5000)
	public void testFixedRate(){
		try {
			log.info("测试fixedRate,1111111111-----{}",testFixedRate++);
			Thread.sleep(3000);
			log.info("测试fixedRate,2222222222");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * fixedDelay 上一次执行完毕时间点后延迟执行
	 */
	@Scheduled(fixedDelay=5000)
	public void testFixedDelay() {
		try {
			log.info("测试fixedDelay定时任务333333333-----{}",testFixedDelay++);
			Thread.sleep(3000);
			log.info("测试fixedDelay定时任务444444444");
		} catch (InterruptedException e) {
			e.printStackTrace();  
		}
	}
}


这时候发现一个问题,就是我们执行定时任务都是一个线程执行的。


所以,如果需要多线程执行,需要配定时任务配置类,设置线程数。

import java.util.concurrent.Executors;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

/**
 * 定时任务配置类
 * 配置定时任务的并发数
 * @author maybe
 */
@Configuration
public class ScheduleConfig implements SchedulingConfigurer{

	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
	}
}

这时候再次执行:



这里多线程执行如果自己写一个线程来执行可不可以呢?

我试了一下,写一个线程是可以的。但是对于fixedDelay会有一个问题就是,他会和fixedRate一样,使用开始时间的后几秒,作为执行时间点。我觉得这可能和每次执行都是一个独立线程有关。具体还需要去学习研究一下。


cron时间表达式

这段是网上找的:

        Seconds : 可出现", - * /"四个字符,有效范围为0-59的整数
Minutes : 可出现", - * /"四个字符,有效范围为0-59的整数
Hours : 可出现", - * /"四个字符,有效范围为0-23的整数
DayofMonth : 可出现", - * / ? L W C"八个字符,有效范围为0-31的整数
Month : 可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEc
DayofWeek : 可出现", - * / ? L C #"四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推

Year : 可出现", - * /"四个字符,有效范围为1970-2099年


下面简单举几个例子:
"0 0 12 * * ?"    每天中午十二点触发
"0 15 10 ? * *"    每天早上10:15触发
"0 15 10 * * ?"    每天早上10:15触发
"0 * 14 * * ?"    每天从下午2点开始到2点59分每分钟一次触发
"0 0/5 14 * * ?"    每天从下午2点开始到2:55分结束每5分钟一次触发
"0 0/5 14,18 * * ?"    每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发
"0 0-5 14 * * ?"    每天14:00至14:05每分钟一次触发
"0 10,44 14 ? 3 WED"    三月的每周三的14:10和14:44触发
"0 15 10 ? * MON-FRI"    每个周一、周二、周三、周四、周五的10:15触发

* : 表示匹配该域的任意值,比如在秒*, 就表示每秒都会触发事件。;
? : 只能用在每月第几天和星期两个域。表示不指定值,当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”;
- : 表示范围,例如在分域使用5-20,表示从5分到20分钟每分钟触发一次  
/ : 表示起始时间开始触发,然后每隔固定时间触发一次,例如在分域使用5/20,则意味着5分,25分,45分,分别触发一次.  
, : 表示列出枚举值。例如:在分域使用5,20,则意味着在5和20分时触发一次。  
L : 表示最后,只能出现在星期和每月第几天域,如果在星期域使用1L,意味着在最后的一个星期日触发。  
W : 表示有效工作日(周一到周五),只能出现在每月第几日域,系统将在离指定日期的最近的有效工作日触发事件。注意一点,W的最近寻找不会跨过月份  
LW : 这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。  

# : 用于确定每个月第几个星期几,只能出现在每月第几天域。例如在1#3,表示某月的第三个星期日。


好了,大概就这么多。spring boot还是有很多功能的。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34083066/article/details/79960255

Spring Boot配置定时任务(实例)

SpringBoot的定时任务可以直接使用自带的Scheduled,它相当于一个轻量级的Quartz,它可以让我们直接使用注解来完成定时任务的配置。详情如下@Configuration @Enable...
  • m0_37885618
  • m0_37885618
  • 2017-08-15 16:35:13
  • 5626

Spring Boot (教程十三:定时任务)

GitHub 地址:https://github.com/asd821300801/Spring-Boot.git Spring Boot (教程十三:定时任务)...
  • gfd54gd5f46
  • gfd54gd5f46
  • 2017-08-18 16:02:38
  • 1042

Spring Boot 菜鸟教程 13 注解定时任务

注解 @Scheduled(cron = “0/5 * * * * ?”) 相当于原来的xml版本的如下配置 task:scheduled ref="scheduledTask" method=...
  • JE_GE
  • JE_GE
  • 2016-12-02 17:46:46
  • 4273

maven工程-基于springboot定时任务

  • 2016年07月21日 18:18
  • 9.41MB
  • 下载

spring boot中定时任务的使用

主要用到两个注解: @Scheduled(fixedDelay = 5000) @EnableScheduling 其中@Scheduled有参数fixedDelay和fixedRate 前者是以...
  • amanicspater
  • amanicspater
  • 2017-05-31 10:17:57
  • 776

6、spring-boot 定时任务和异步实现

使用@Scheduled创建定时任务使用@Async实现异步调用
  • wanbf123
  • wanbf123
  • 2017-06-01 13:54:44
  • 1248

spring boot实现定时任务

1. 定时任务实现方式 定时任务实现方式:     Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程...
  • zhang_oracle
  • zhang_oracle
  • 2017-08-15 10:57:41
  • 333

Spring Boot 定时任务的使用

本文介绍在 Spring Boot 中如何使用定时任务,使用非常简单,就不做过多说明了。下面是代码类:package org.springboot.sample.config;import org.s...
  • catoop
  • catoop
  • 2016-03-21 12:35:57
  • 25008

Spring Boot 定时任务单线程和多线程

Spring Boot 的定时任务: 第一种:把参数配置到.properties文件中: 代码: package com.accord.task; import java.text.Simpl...
  • u013456370
  • u013456370
  • 2018-03-01 14:46:21
  • 570

SpringBoot定时任务说明

介绍SpringBoot定时任务,利用@Scheduled注解实现,可以通过配置applicationContext.xml来实现单线程定时任务和多线程定时任务。...
  • loongshawn
  • loongshawn
  • 2016-02-14 16:24:47
  • 50432
收藏助手
不良信息举报
您举报文章:spring boot 定时任务
举报原因:
原因补充:

(最多只允许输入30个字)