环境:springboot2.2.11.RELEASE

2种方式执行定时任务

1、通过springboot的方式

2、使用Quartz实现定时任务


方式一:通过springboot的定时任务

1、开启定时任务功能@EnableScheduling

@SpringBootApplication @EnableScheduling public class SpringBootQuartzSchedulerApplication { public static void main(String[] args) { SpringApplication.run(SpringBootQuartzSchedulerApplication.class, args); } }

2、编写定时执行的任务@Scheduled

@Component public class JobExecutor { // 每3秒执行 @Scheduled(fixedDelay = 3000) public void process() { System.out.println("执行任务") ; } }

@Scheduled注解的属性说明:

fixedDelay:在上一次调用结束和下一次调用开始之间以毫秒为单位的固定时间段执行。

fixedRate:在调用之间以毫秒为单位执行任务。

initialDelay:延迟指定的毫秒数。

cron:cron表达式。

在这里@Scheduled(cron = "0/2 * * * * ?") 这里的表达式还可以通过配置的方式进行:

@Scheduled(cron = "${custom.cron}")

server: port: 8080 --- custom: cron: 0/3 * * * * ?

Cron表达式说明:

cron一定有七位数,最后一位是年,SpringBoot定时方案只需要设置六位即可:

cron中,还有一些特殊的符号,含义如下:

举几个例子熟悉一下:

springboot自定的定时任务使用非常简单,通过以上简单的方式执行。


方式二:通过Quartz执行定时任务

先了解Quartz的核心类:

Quartz有四个核心概念:

Job 为作业的接口,为任务调度的对象;JobDetail 用来描述 Job 的实现类及其他相关的静态信息;Trigger 作为作业的定时管理工具,一个 Trigger 只能对应一个作业实例,而一个作业实例可对应多个触发器;Scheduler 作为定时任务容器,是 Quartz 最上层的东西,它提携了所有触发器和作业,使它们协调工作,每个 Scheduler 都存有 JobDetail 和 Trigger 的注册,一个 Scheduler 中可以注册多个 JobDetail 和多个 Trigger。

1、添加依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>

2、配置任务Job,JobDetail,Trigger

@Configuration public class QuartzConfig { @Bean public JobDetail sampleJobDetail() { JobDataMap dataMap = new JobDataMap() ; dataMap.put("k1", "v1") ; return Jobbuilder.newJob(SampleJob.class).withIdentity("sampleJob") .usingJobData("key","pack").usingJobData(dataMap).storeDurably().build() ; } /** * 一个简单的触发器:每隔两秒执行一次(一直重复) * @return */ @Bean public Trigger sampleJobTrigger(){ SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever(); return TriggerBuilder.newTrigger().forJob(sampleJobDetail()).withIdentity("sampleTrigger") .withSchedule(scheduleBuilder).build(); } }

任务:

public class SampleJob extends QuartzJobBean { private static final Logger logger = LoggerFactory.getLogger(SampleJob.class) ; @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { logger.info("这里是一个简单的任务") ; JobDataMap dataMap = context.getJobDetail().getJobDataMap() ; Set<Entry<String, Object>> entrys = dataMap.entrySet() ; for (iterator<Entry<String, Object>> iterator = entrys.iterator(); iterator.hasNext();) { Entry<String, Object> entry = iterator.next(); logger.info("任务数据:key = {}, value = {}", entry.getKey(), entry.getValue()) ; } } }

启动服务:

springboot自动配置的流程 springboot中定时任务执行Quartz的使用(1)

执行任务也非常简单,接下来通过cron表达式的方式配置触发器:

@Bean public Trigger cronJobTrigger() { CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?") ; return TriggerBuilder.newTrigger() .forJob(sampleJobDetail()) .withIdentity("t1", "CRON") .withSchedule(scheduleBuilder) .build() ; }

完毕!!!

给个关注,转发吧,谢谢

Spring MVC 异步请求方式

Spring MVC 异常处理方式

Spring Cloud Sentinel整合Feign

SpringCloud Nacos 整合feign

SpringMVC参数统一验证方法

Springboot Security 基础应用 (1)

SpringBoot中使用Cache及JSR107的使用

SpringBoot RabbitMQ消息可靠发送与接收

Springboot之Actuator详解

Springboot接口幂等性基于token实现方案

,