Spingboot 定时任务与拦截器(详细解释)

news2024/12/28 5:57:06
boot 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时
任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Quartz Spring Boot 源自
Spring+SpringMVC ,因此天然具备这两个 Spring 中的定时任务实现策略,当然也支持
Quartz (不做过多介绍)。

1.定时任务 @Scheduled

@Configuration //1.主要用于标记配置类
@EnableScheduling // 2.开启定时任务
public class SaticScheduleTask {
@Resource
UserService userService;
//3.添加定时任务 每隔5秒调用一次
@Scheduled(cron = "0/5 * * * * ?")
public void configureTasks() {
userService.addUser();
System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
}
}
cron = [ ] [ ] [ 小时 ] [ ] [ ] [ ] [ ]
月份中的日期和星期可能会起冲突,因此在配置时这两个得有一个是 ?
? :表示不指定值,即不关心某个字段的取值时使用。需要注意的是,月份中的日期和星期可能会
起冲突,因此在配置时这两个得有一个是?
* :表示所有值,例如 : 在秒的字段上设置 *, 表示每一秒都会触发
:用来分开多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发
- :表示区间,例如在秒上设置 "10-12", 表示 10,11,12 秒都会触发
/ :用于递增触发,如在秒上面设置 "5/15" 表示从 5 秒开始,每增 15 秒触发 (5,20,35,50)
# :序号 ( 表示每月的第几个周几 ) ,例如在周字段上设置 "6#3" 表示在每月的第三个周六, ( 用 在母
亲节和父亲节再合适不过了 ) 周字段的设置,若使用英文字母是不区分大小写的 ,即 MON mon
相同
L :表示最后的意思。在日字段设置上,表示当月的最后一天 ( 依据当前月份,如果是二月还会自
动判断是否是润年 ), 在周字段上表示星期六,相当于 "7" "SAT" (注意周日算是第一天)。如果
"L" 前加上数字,则表示该数据的最后一个。例如在周字段上设置 "6L" 这样的格式 , 则表示 " 本月
最后一个星期五 "
W :表示离指定日期的最近工作日 ( 周一至周五 ) ,例如在日字段上设置 "15W" ,表示离每月 15 号最
近的那个工作日触发。如果 15 号正好是周六,则找最近的周五 (14 ) 触发 , 如果 15 号是周未,则找
最近的下周一 (16 ) 触发,如果 15 号正好在工作日 ( 周一至周五 ) ,则就在该天触发。如果指定格式
"1W", 它则表示每月 1 号往后最近的工作日触发。如果 1 号正是周六,则将在 3 号下周一触发。
( 注, "W" 前只能设置具体的数字 , 不允许区间 "-")
L W 可以一组合使用。如果在日字段上设置 "LW", 则表示在本月的最后一个工作日触发
0 0 2 1 ? :表示在每月 1 日的凌晨 2 点执行
0 15 10 ? * MON-FRI :表示周一到周五每天上午 10:15 执行
0 15 10 ? 6L 2019-2020 :表示 2019-2020 年的每个月的最后一个星期五上午 10:15 执行
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 ? 2019 2019 年的每天上午 10:15 执行
创建多线程定时任务
@Configuration //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling // 2.开启定时任务
@EnableAsync // 2.开启多线程
public class SaticScheduleTask {
@Resource
UserService userService;
//3.添加定时任务
@Scheduled(cron = "0/5 * * * * ?")
@Async //异步方法 异步调用 默认为同步
@Transactional //添加事务
public void configureTasks() {
userService.addUser();
System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
}
}
根据 Spring 的文档说明,默认采用的是单线程的模式的。所以在 Java 应用中,绝大多数情况下都
是通过同步的方式来实现交互处理的。
那么当多个任务的执行势必会相互影响。例如,如果 A 任务执行时间比较长,那么 B 任务必须等到
A 任务执行完毕后才会启动执行。又如在处理与第三方系统交互的时候,容易造成响应迟缓的情
况,之前大部分都是使用多线程来完成此类任务,其实,在 spring3.x 之后,已经内置了 @Async
来完美解决这个问题。

2.拦截器

SpringMvc 的处理拦截器类似于 Servlet 开发中的过滤器 Filter ,用于对处理器进行预处理和后处理,开
发可以自己定义一些拦截器来实现特定功能。
### 拦截器与过滤器的区别
过滤器
servlet 规范中的一部分,任何 java web 程序都可以使用。
url-pattern 中配置之后,可以对所要访问的资源进行拦截。
拦截器
拦截器在 SpringMvc 框架自己的,只有使用了 SpringMvc 框架工程才能使用。
拦截器只会拦截访问控制器的方法,如果访问的是 js css image... 是不会进行拦截的。
##SpringBoot 中使用拦截器

1. 实现HandlerInterceptor接口

@Component
public class LoginInterceptor implements HandlerInterceptor {
//preHandle是请求执行前执行的
@Override
public boolean preHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("进入拦截器");
return true;
}
//postHandler是请求结束执行的 当preHandle返回true才会执行
public void postHandle.....
//afterCompletion是视图渲染完成后才执行
public void afterCompletion.....
}

2.实现WebMvcConfigurer接口配置拦截路径

三种方式:

1. 继承WebMvcConfigurerAdapter spring5.0 以弃用,不推荐

2. 实现WebMvcConfigurer 推荐

3. 继承WebMvcConfigurationSupport 会导致springboot自动配置失效

@Configuration
public class WebJavaBeanConfiguration implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/login")
.excludePathPatterns("/user/logout");
}
}
addInterceptor :需要一个实现 HandlerInterceptor 接口的拦截器实例
addPathPatterns :用于设置拦截器的过滤路径规则;
addPathPatterns("/**") 对所有请求都拦截
excludePathPatterns :用于设置不需要拦截的过滤规则
拦截器主要用途:进行用户登录状态的拦截,日志的拦截等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人机+无人车+无人狗+无人船:互通互联技术探索详解

关于“无人机无人车机器狗(注:原文中的“无人狗”可能是一个笔误,因为在实际技术领域中,常用的是“机器狗”这一术语)无人船”的互通互联技术,以下是对其的详细探索与解析: 一、系统架构与关键…

ima.copilot-腾讯智能工作台

一、产品描述 ima.copilot是腾讯推出的基于腾讯混元大模型技术的智能工作台,通过先进的人工智能技术,为用户提供了一个全新的搜读写体验,让知识管理变得更加智能和高效。它不仅是一个工具,更是一个智能的伙伴,能够帮助…

集合卡尔曼滤波(EnsembleKalmanFilter)的MATLAB例程(三维、二维)

本 M A T L A B MATLAB MATLAB代码实现了一个三维动态系统的集合卡尔曼滤波(Ensemble Kalman Filter, EnKF)示例。代码的主要目的是通过模拟真实状态和测量值,使用 EnKF 方法对动态系统状态进行估计。 文章目录 参数设置初始化真实状态定义状…

【动手学电机驱动】STM32-FOC(5)基于 IHM03 的无感 FOC 控制

STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)IHM03 电机控制套件介绍 STM32-FOC(5&…

光老化测试的三种试验:紫外老化、氙灯老化、碳弧灯老化

光老化是指材料在阳光照射下,由于紫外线、热和氧气的共同作用而发生的物理和化学变化。这种现象对纺织材料、塑料材料、涂料材料和橡胶材料的应用有显著影响。这些材料户外家具、汽车内饰和户外供水排水管道、建筑外墙涂料、汽车漆面、船舶涂料、汽车轮胎、密封件、…

VMWare安装包及安装过程

虚拟机基本使用 检查自己是否开启虚拟化 如果虚拟化没有开启,需要自行开启:百度加上自己电脑的品牌型号,进入BIOS界面开启 什么是虚拟机 所谓的虚拟机,就是在当前计算机系统中,又开启了一个虚拟系统 这个虚拟系统&…

消费的外部性

大学宿舍,遇到在你睡觉的时候开外放不戴耳机的室友,但中午12点,室友却在那拉上窗帘睡觉。能带饭吗?能代签到吗?能倒个垃圾吗?能带个外卖吗?自己永远麻烦别人,你要让他帮个忙又这推那…

易趋亮相2024 PMI项目管理大会

11月9日-10日,2024 PMI项目管理大会在广州圆满举办,项目管理行业优秀代表企业——易趋(隶属深圳市蓝云软件有限公司),携最新产品和解决方案亮相本次展会。 (主论坛现场) 本届大会以“‘项’有所成 行以致远…

边缘计算与推理算力:智能时代的加速引擎

在数据量爆炸性增长的今天,边缘计算与推理算力正成为推动智能应用的关键力量。智能家居、自动驾驶、工业4.0等领域正在逐步从传统的云端计算转向边缘计算,而推理算力的加入,为边缘计算提供了更强的数据处理能力和实时决策能力。本文将探讨边缘…

基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面

文章目录 前言🎓一、数据集准备🎓二、模型训练🍀🍀1.初始化🍀🍀2.加载数据集🍀🍀3.划分数据集,并保存到新的文件夹🍀🍀4.可视化数据集&#x1f34…

马斯克万卡集群AI数据中心引发的科技涟漪:智算数据中心挑战与机遇的全景洞察

一、AI 爆发重塑数据中心格局 随着AI 技术的迅猛发展,尤其是大模型的崛起,其对数据中心产生了极为深远的影响。大模型以其数以亿计甚至更多的参数和对海量数据的处理需求,成为了 AI 发展的核心驱动力之一,同时也为数据中心带来了…

移远通信亮相骁龙AI PC生态科技日,以领先的5G及Wi-Fi产品革新PC用户体验

PC作为人们学习、办公、娱乐的重要工具,已经深度融入我们的工作和生活。随着物联网技术的快速发展,以及人们对PC性能要求的逐步提高,AI PC成为了行业发展的重要趋势。 11月7-8日,骁龙AI PC生态科技日在深圳举办。作为高通骁龙的重…

Unity资源打包Addressable资源保存在项目中

怎么打包先看“Unity资源打包Addressable AA包” 其中遗留一个问题,下载下来的资源被保存在C盘中了,可不可以保存在项目中呢?可以。 新建了一个项目,路径与“Unity资源打包Addressable AA包”都不相同了 1.创建资源缓存路径 在…

postman变量和脚本功能介绍

1、基本概念——global、collection、environment 在postman中,为了更好的管理各类变量、测试环境以及脚本等,创建了一些概念,包括:globals、collection、environment。其实在postman中,最上层还有一个Workspaces的概…

为什么汽车电源正在用 48V 取代 12V

欧姆定律也有利于 48 伏电源 假设您需要为汽车的起动电机供电。可能存在以下静态和动态特征: 电源电压:12V 额定电流:40A 额定功率:480W 标称平均阻抗:0.3Ω 浪涌电流:150A 浪涌功率:1,8…

【webrtc】 RTP 中的 MID(Media Stream Identifier)

RTP 中的 MID(Media Stream Identifier) RID及其与MID的区别 cname与mid的对比【webrtc】CNAME 是rtprtcp中的Canonical Name(规范化名称) 同样都是RTP头部扩展: 基于mediasoup的最新的代码,学习,发现mid在创建RtpSendStream时是必须传递的参数: 例如 D:\XTRANS\soup\…

酷炫的鼠标移入效果(附源码!!)

预览效果 源码(htmljs部分) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

PHP和Python脚本的性能监测方案

目录 1. 说明 2. PHP脚本性能监测方案 2.1 安装xdebug 2.2 配置xdebug.ini 2.3 命令行与VS Code中使用 - 命令行 - VS Code 2.4 QCacheGrind 浏览 3. Python脚本性能监测方案 3.1 命令行 4. 工具 5.参考 1. 说明 获取我们的脚本程序运行时的指标&#xff0c;对分析…

【人工智能】10分钟解读-深入浅出大语言模型(LLM)——从ChatGPT到未来AI的演进

文章目录 一、前言二、GPT模型的发展历程2.1 自然语言处理的局限2.2 机器学习的崛起2.3 深度学习的兴起2.3.1 神经网络的训练2.3.2 神经网络面临的挑战 2.4 Transformer的革命性突破2.4.1 Transformer的核心组成2.4.2 Transformer的优势 2.5 GPT模型的诞生与发展2.5.1 GPT的核心…

hive中windows子句的使用

概述 1&#xff0c;windows子句是对窗口的结果做更细粒度的划分 2、windows子句中有两种方式 rows &#xff1a;按照相邻的几行进行开窗 range&#xff1a;按照某个值的范围进行开窗 使用方式 (rows | range) between (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING…