Spring定时任务@Scheduled

在 Spring 框架中,可以使用定时任务来执行周期性或延迟执行的任务。Spring 提供了多种方式来配置和管理定时任务。有Java自带的java.util.Timer类,也有强大的调度器Quartz,还有SpringBoot自带的Scheduled。

在实际应用中,如果没有分布式场景(quartz 支持分布式, schedule 不支持(需要自己实现,用分布式锁),schedule跟spring结合的更好,还是很适用的。

以下介绍的是使用@Scheduled 注解的方式:

1、在启动类上添加@EnableScheduling 注解来开启定时器任务

2、在实现类的方法上添加@Scheduled 注解并设置相关参数

    @Scheduled(cron = "0 22 14 * * ? ")@Overridepublic void testSchedule() {System.out.println("测试定时器");log.debug("定时任务已启动");}

3、相关参数

cron:cron表达式,指定任务在特定时间执行;


图片来源:Cron - 在线Cron表达式生成器

fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
zone:时区,默认为当前时区,一般没有用到。

4、实现用户的预加载功能

业务分析:

(1)预加载能够访问系统的用户(即用户数据存在在数据库中)

        实现逻辑:查找数据库中所有有效用户放入availableUsers哈希表中;

                          给有效用户设置缓存过期的时间,超时删除availableUsers表中该用户缓存。

(2)每个用户有60s时间登录访问系统,超出60秒,从系统中删除

        需要判断:该用户是否存在(数据库)

                          该用户是否超时(能否访问系统)  

5、部分代码示例

UserService层接口方法

    /*** 1、从数据库查出所有用户放入 aviableUsers*/void preLoginUser();//2、redis VIP用户登录预加载,超时删除该用户void preStoreUserInRedis(long roleId);//3、使用上面preStoreUserInRedis方法将roleId=1的有效用户放入vipLoginUsers哈希表中void vipLogin(String username, String password);

UserServiceImpl实现类

    //1、查找数据库中所有有效用户放入availableUsers哈希表中@Scheduled(cron = "0 06 16 * * ?")@Overridepublic void preLoginUser() {List<User> users = userDao.findAll();users.forEach(u->objectRedisTemplate.opsForHash().put("availableUsers","availableUsers:"+u.getUsername(),u));objectRedisTemplate.expire("loginUsers",1, TimeUnit.DAYS);}//2、redis VIP用户登录预加载,超时删除该用户@Overridepublic void preStoreUserInRedis(long roleId) {
//        List<User> users = userDao.findAll();
//        users.forEach(u->
//                objectRedisTemplate.opsForHash().
//                        put("loginUser","loginUser:"+u.getUsername(),u));
//        objectRedisTemplate.expire("loginUser",60, TimeUnit.SECONDS);
//// Set<Object> availableUsers = redisTemplate.opsForHash().keys("availableUsers");//所有用户//System.out.println(availableUsers);//System.out.println("--->"+redisTemplate.opsForHash().entries("availableUsers"));Map<Object, Object> map = objectRedisTemplate.opsForHash().entries("availableUsers");//对所有有效用户遍历map遍历map.forEach((k,v)->{User user = (User) v;if(user.getRoleId().intValue()==roleId){ //如果角色为1,放入活动d的redis缓存objectRedisTemplate.opsForHash().put("vipLoginUsers","vipLoginUsers:"+user.getUsername(),user);}});objectRedisTemplate.expire("vipLoginUsers",60, TimeUnit.SECONDS);}//3、使用上面preStoreUserInRedis方法将roleId=?的有效用户放入vipLoginUsers哈希表中//另外,加入异常@Overridepublic void vipLogin(String username, String password) {/*使用 Redis 的 opsForHash().get() 方法从名为 "availableUsers" 的 Hash 中获取键key为 "availableUsers:" + username 的值value,并将其赋给 availableUsers 对象。如果获取到的值为空,则表示该用户不存在。如果用户不存在,在下一行将会抛出自定义异常 IlegealUserException。*/Object availableUsers = objectRedisTemplate.opsForHash().get("availableUsers", "availableUsers:" + username);if(Objects.isNull(availableUsers)) throw  new IlegealUserException("用户不存在异常");Object vip = objectRedisTemplate.opsForHash().get("vipLoginUsers", "vipLoginUsers:" + username);if(Objects.isNull(vip)) throw  new NotVipException("不是有效的vip用户禁止登录");/*总的来说,这段代码用于进行 VIP 用户登录验证。首先,从 Redis 中获取用户名对应的用户信息 aviableUsers,如果为空,表示用户不存在,会抛出 IlegealUserException 异常。然后,从 Redis 中获取用户名对应的 VIP 用户信息 vip,如果为空,表示用户不是 VIP 用户,会抛出 NotVipException 异常。如果两个条件都满足,则表示用户存在且为 VIP 用户,可以进行后续操作。*/}

控制层

    //3、VIP用户按时登录完成@GetMapping("/vipLogin")public HttpResp vipLogin(String username, String password){userService.vipLogin(username,password);return HttpResp.success("按时登录完成");}//2、预先加载所有vip客户到缓存中,根据roleId=?查询出的(业务实现层)@GetMapping("/setVip")public HttpResp setVip(long roleId){userService.preStoreUserInRedis(roleId);return HttpResp.success("预先加载所有vip客户到缓存中");}

参考:

SpringBoot学习-(十九)SpringBoot定时器#Schedule_wx6345200418f8c的技术博客_51CTO博客

https://www.cnblogs.com/toutou/p/9802955.html


感谢阅读,码字不易,多谢点赞!如有不当之处,欢迎反馈指出,感谢!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊分布式架构09——分布式中的一致性协议

目录 01从集中式到分布式 系统特点 集中式特点 分布式特点 事务处理差异 02一致性协议与Paxos算法 2PC&#xff08;Two-Phase Commit&#xff09; 阶段一&#xff1a;提交事务请求 阶段二&#xff1a;执行事务提交 优缺点 3PC&#xff08;Three-Phase Commit&#x…

实际项目中最常用的设计模式

在软件开发领域,设计模式是一种经过验证的通用解决方案,用于解决各种常见问题。它们有助于提高代码的可维护性、可扩展性和可重用性。虽然有许多不同的设计模式,但以下是实际项目中最常用的一些: 1. 单例模式 (Singleton Pattern) 单例模式确保一个类只有一个实例,并提供…

蓝桥杯每日一题2023.10.21

后缀表达式 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 30分解法&#xff1a;要求出最大的结果就需要加的数越大&#xff0c;减的数越小&#xff0c;以此为思路简单列举即可 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 2e5 10…

AI智能分析视频监控系统如何助力智慧民宿规范化、安全最大化?

民宿智能监控系统是一种便捷而有效的安全解决方案&#xff0c;它可以提供全面的监控和保护民宿的功能。以下为具体方案&#xff1a; 1、视频监控 安装高清摄像头覆盖民宿的关键区域&#xff0c;如大门、入口、走廊和共用区域等。这些摄像头可以实时监控&#xff0c;记录入住和…

线上Timeout waiting for connection from pool问题分析和解决方案

目录 现象 理论分析 代码分析 解决方案 方案一:直接修改pollingConnectionManager 方案二:修改HttpClient 参考 现象 线上共有5个类似服务,但是只有流量较大的服务会出现成功率的问题。 问题的表现主要是在GetFile(fileId=AgACAgUAAxkDAAEbP1JlJPxyJM82phEKhYYZYfY9…

工业RFID厂家与您分享工业生产制造的应用案例

随着科技的不断进步&#xff0c;RFID技术在工业生产制造领域的应用越来越广泛。AGV/RGV小车运输、立体仓库、生产线、物料跟踪与管理等各行业工业自动化的使用上都有着RFID的身影。为工业生产制造智能化自动化提供了助力。下面&#xff0c;为大家分享RFID技术在工业生产制造上的…

使用C#和Flurl.Http库的下载器程序

根据您的要求&#xff0c;我为您编写了一个使用C#和Flurl.Http库的下载器程序&#xff0c;用于下载凤凰网的图片。以下是一个简单的示例代码&#xff1a; using System; using Flurl.Http;namespace DownloadImage {class Program{static void Main(string[] args){string url…

Unity之ShaderGraph如何实现触电电流效果

前言 之前使用ASE做过一个电流效果的shader&#xff0c;今天我们通过ShaderGraph来实现一个电流效果。 效果如下&#xff1a; 关键节点 Simple Noise&#xff1a;根据输入UV生成简单噪声或Value噪声。生成的噪声的大小由输入Scale控制。 Power&#xff1a;返回输入A的结果…

docker运行redis镜像

很多项目会用到redis作为缓存用到项目中&#xff0c;鉴于刚了解过docker&#xff0c;今天这里用docker运行redis镜像&#xff0c;这样下载&#xff0c;安装运行&#xff0c;或者是使用后的删除都会干净&#xff0c;简单。 好了&#xff0c;第一步是先拉取镜像&#xff0c;使用d…

2023年浙大MEM考前80天上岸经验分享

时间过得真快&#xff0c;转眼间已经是十月份了。回想起去年这个时候&#xff0c;我还在为考研而感到焦虑不安。然而&#xff0c;如今我已经在浙大MEM项目学习了一个多月的时间了。在这一个月的学习过程中&#xff0c;我不仅学到了许多专业知识&#xff0c;还结识了很多志同道合…

STM32cubemx对FreeRTOS的适配(工程模板配置)

文章目录 前言一、工程的创建二、什么是CMSIS三、STM32cubemx生成的FreeRTOS工程分析总结 前言 本篇文章将带大家使用STM32cubemx对FreeRTOS进行工程模板的配置。 一、工程的创建 1.开始工程的创建&#xff1a; 2.芯片型号选择&#xff1a; 3.修改时钟为TIM8&#xff1a; …

JS学习-CryptoJS加密库

CryptoJS加密库 安装库 npm install crypto-js如下例子 对称加密 const CryptoJS require(crypto-js); //引入加密库 var str"123456" //md5加密 console.log(CryptoJS.MD5(str).toString()) var str2 CryptoJS.enc.Utf8.parse(str); //可以把字符串转成UTF-…

大数据Flink(一百):SQL自定义函数(UDF)和标量函数(Scalar Function)

文章目录 SQL自定义函数(UDF)和标量函数(Scalar Function)

只需五步,在Linux安装chrome及chromedriver(CentOS)

一、安装Chrome 1&#xff09;先执行命令下载chrome&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm2&#xff09;安装chrome yum localinstall google-chrome-stable_current_x86_64.rpm看到下图中的Complete出现则代表安装…

微信小程序之会议OA系统首页布局搭建与Mock数据交互

目录 前言 一、Flex 布局&#xff08; 分类 编程技术&#xff09; 1、Flex布局是什么&#xff1f; 2、基本概念 3、容器的属性 3.1 flex-direction属性 3.2 flex-wrap属性 3.3 flex-flow 3.4 justify-content属性 3.5 align-items属性 3.6 align-content属性 4、项目…

CentOS | 添加普通用户并授权sudo

sudo -i adduser peter passwd peter whereis sudoers nano /etc/sudoers添加一行新用户到root组 ## Allow root to run any commands anywhere root ALL(ALL) ALL peter ALL(ALL) ALL如果提升权限后无法cd到其他目录等&#xff0c;修改 /etc/passwd 文件&…

2023CANN训练营第二季——Ascend C算子开发(入门)——基础概念

第一章 Ascend C 算子开发入门 一、基础概念 1.Ascend C 概念&#xff1a;Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术&#xff0c;极大提高算子…

Linux中shell外壳,用户权限,文件权限

Linux 权限 1.shell外壳1.1 shell外壳的定义1.2 shell外壳的作用1.3 shell的原理 2.Linux用户权限2.1创建普通用户2.2 用户之间的切换2.3 sudo指令 3.Linux文件权限3.1文件访问者的分类&#xff08;人&#xff09;3.2 文件文件类型和访问权限&#xff08;事物属性&#xff09;3…

大语言模型(LLM)综述(一):大语言模型介绍

A Survey of Large Language Models 前言1. INTRODUCTION2. OVERVIEW2.1 大语言模型的背景2.2 GPT系列模型的技术演变 前言 随着人工智能和机器学习领域的迅速发展&#xff0c;语言模型已经从简单的词袋模型&#xff08;Bag-of-Words&#xff09;和N-gram模型演变为更为复杂和…

【模型推理优化学习笔记】张量并行和流水线并行简介

张量并行 当每个张量被分成多个块时&#xff0c;就会发生张量并行性&#xff0c;并且张量的每个块都可以放置在单独的 GPU 上。在计算过程中&#xff0c;每个块在不同的 GPU 上单独并行处理&#xff0c;并且可以通过组合来自多个 GPU 的结果来计算结果&#xff08;最终张量&am…