springboot 基于@Scheduled注解 实现定时任务

本文解析了一线大厂Java面试题,涵盖SpringBoot配置、MySQL数据库连接、MyBatis集成、动态定时任务实现(包括基于接口的SchedulingConfigurer)以及高并发场景下的秒杀设计,提供了实战项目源码链接。
摘要由CSDN通过智能技术生成

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
二、动态:基于接口


基于接口(SchedulingConfigurer)

org.springframework.boot

spring-boot-starter

2.0.4.RELEASE

org.springframework.boot

spring-boot-starter-web

mysql

mysql-connector-java

org.mybatis.spring.boot

mybatis-spring-boot-starter

1.3.1

org.mybatis

mybatis

3.4.5

compile

2、添加数据库记录:

开启本地数据库mysql,随便打开查询窗口,然后执行脚本内容,如下:

DROP DATABASE IF EXISTS socks;

CREATE DATABASE socks;

USE SOCKS;

DROP TABLE IF EXISTS cron;

CREATE TABLE cron (

cron_id varchar(30) NOT NULL PRIMARY KEY,

cron varchar(30) NOT NULL

);

INSERT INTO cron VALUES (‘1’, ‘0/5 * * * * ?’);

1470521-20190716114713852-815517104.pnguploading.4e448015.gif转存失败重新上传取消

然后在项目中的application.yml 添加数据源:

spring:

datasource:

url: jdbc:mysql://localhost:3306/socks

username: root

password: 123456

3、创建定时器

数据库准备好数据之后,我们编写定时任务,注意这里添加的是TriggerTask,目的是循环读取我们在数据库设置好的执行周期,以及执行相关定时任务的内容。

具体代码如下:

@Component

@Configuration //1.主要用于标记配置类,兼备Component的效果。

@EnableScheduling // 2.开启定时任务

public class DynamicScheduleTask implements SchedulingConfigurer {

@Mapper

public interface CronMapper {

@Select(“select cron from cron limit 1”)

public String getCron();

}

@Autowired //注入mapper

@SuppressWarnings(“all”)

CronMapper cronMapper;

/**

  • 执行定时任务.

*/

@Override

public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

taskRegistrar.addTriggerTask(

//1.添加任务内容(Runnable)

() -> System.out.println("执行动态定时任务: " + LocalDateTime.now().toLocalTime()),

//2.设置执行周期(Trigger)

triggerContext -> {

//2.1 从数据库获取执行周期

String cron = cronMapper.getCron();

//2.2 合法性校验.

if (StringUtils.isEmpty(cron)) {

// Omitted Code …

}

//2.3 返回执行周期(Date)

return new CronTrigger(cron).nextExecutionTime(triggerContext);

}

);

}

}

1470521-20190716114812476-37261964.pnguploading.4e448015.gif转存失败重新上传取消

三、多线程定时任务


基于注解设定多线程定时任务

1、创建多线程定时任务

//@Component注解用于对那些比较中立的类进行注释;

//相对与在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释

@Component

@EnableScheduling // 1.开启定时任务

@EnableAsync // 2.开启多线程

public class MultithreadScheduleTask {

@Async

@Scheduled(fixedDelay = 1000) //间隔1秒

public void first() throws InterruptedException {

System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());

System.out.println();

Thread.sleep(1000 * 10);

}

@Async

总目录展示

该笔记共八个节点(由浅入深),分为三大模块。

高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。

一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

由于内容太多,这里只截取部分的内容。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

[外链图片转存中…(img-6GYGwj3S-1714663903842)]

[外链图片转存中…(img-0KGuRhQY-1714663903842)]

由于内容太多,这里只截取部分的内容。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,通过`@RestController`注解执行定时任务管理的业务流程可以按照以下步骤进行: 1. 首先,确保在Spring Boot项目的pom.xml文件中添加了以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 创建一个任务管理类,该类负责定义定时任务的具体执行逻辑。在该类上添加`@Component`注解,将其作为一个组件进行注册。 ```java import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class TaskManager { // 每隔5秒执行一次任务 @Scheduled(fixedRate = 5000) public void task() { // 任务逻辑代码 System.out.println("执行定时任务"); } } ``` 在上述代码中,我们定义了一个名为`task`的方法,并使用`@Scheduled`注解指定了任务的执行频率为每隔5秒执行一次。 3. 创建一个控制器类,使用`@RestController`注解声明为一个RESTful接口,并注入任务管理类的实例。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TaskController { @Autowired private TaskManager taskManager; @GetMapping("/startTask") public String startTask() { // 启动定时任务 return "定时任务已启动"; } @GetMapping("/stopTask") public String stopTask() { // 停止定时任务 return "定时任务已停止"; } } ``` 在上述代码中,我们使用`@RestController`注解将类声明为一个RESTful接口。在`startTask`和`stopTask`方法中,可以调用任务管理类的相关方法来启动和停止定时任务。 4. 在Spring Boot应用程序的启动类上添加`@EnableScheduling`注解,以启用定时任务的支持,并运行你的应用程序。 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 通过以上步骤,你可以通过访问`/startTask`和`/stopTask`接口来触发定时任务的启动和停止。当调用`/startTask`接口时,定时任务将开始执行;当调用`/stopTask`接口时,定时任务将停止执行。 注意:为了能够使用定时任务功能,需要在Spring Boot应用程序的配置类或启动类上添加`@EnableScheduling`注解。这样,Spring Boot会自动扫描并执行被`@Scheduled`注解标记的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值