核心:java.util.concurrent.Delayed和org.springframework.boot.CommandLineRunner;

场景:用户注册后,5分钟推送消息等

一、依赖包

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--非必须--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.0.M1</version></dependency><!--非必须--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency><!--非必须--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

二、工具类

执行任务所需的基础参数


import lombok.Data;@Data
public class TaskBase {//任务参数,根据业务需求多少都行private String identifier;public TaskBase(String identifier) {this.identifier = identifier;}
}

执行的任务和时间

import cn.hutool.core.date.DateUtil;import java.util.Date;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
/*** 延时任务*/
public class DelayTask implements Delayed {//任务参数final private TaskBase data;//任务的延时时间,单位毫秒final private long expire;/*** 构造延时任务** @param data   业务数据* @param expire 任务延时时间(ms)*/public DelayTask(TaskBase data, long expire) {super();this.data = data;this.expire = expire + System.currentTimeMillis();}public TaskBase getData() {return data;}public long getExpire() {return expire;}@Overridepublic boolean equals(Object obj) {if (obj instanceof DelayTask) {return this.data.getIdentifier().equals(((DelayTask) obj).getData().getIdentifier());}return false;}@Overridepublic String toString() {return "{" + "data:" + data.toString() + "," + "延时时间:" +expire+ DateUtil.format(new Date(),"yyyy.MM.dd HH:mm:ss") + "}";}@Overridepublic long getDelay(TimeUnit unit) {return unit.convert(this.expire - System.currentTimeMillis(), unit);}@Overridepublic int compareTo(Delayed o) {long delta = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);return (int) delta;}
}

任务管理器

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Executors;@Component
@Slf4j
public class DelayQueueManager implements CommandLineRunner {private final DelayQueue<DelayTask> delayQueue = new DelayQueue<>();/*** 加入到延时队列中** @param task*/public void put(DelayTask task) {log.error("加入延时任务:{}", task);delayQueue.put(task);}/*** 取消延时任务** @param task* @return*/public boolean remove(DelayTask task) {log.error("取消延时任务:{}", task);return delayQueue.remove(task);}/*** 取消延时任务** @param taskid* @return*/public boolean remove(String taskid) {return remove(new DelayTask(new TaskBase(taskid), 0));}@Overridepublic void run(String... args) throws Exception {log.info("初始化延时队列");Executors.newSingleThreadExecutor().execute(new Thread(this::excuteThread));}/*** 延时任务执行线程*/private void excuteThread() {while (true) {try {DelayTask task = delayQueue.take();//执行任务processTask(task);} catch (InterruptedException e) {break;}}}/*** 内部执行延时任务** @param task*/private void processTask(DelayTask task) {//获取任务参数,执行业务task.getData().getIdentifier()log.error("执行延时任务:{}-{}", task, task.getData().getIdentifier());}
}

三、执行测试任务

import com.example.demo.task.DelayQueueManager;
import com.example.demo.task.DelayTask;
import com.example.demo.task.TaskBase;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class DemoApplicationTests {@Autowiredprivate DelayQueueManager delayQueueManager;@Testvoid contextLoads() throws InterruptedException {//新增任务delayQueueManager.put(new DelayTask(new TaskBase("abc"), 1000 * 1));//新增任务delayQueueManager.put(new DelayTask(new TaskBase("abc"), 1000 * 5));//新增任务delayQueueManager.put(new DelayTask(new TaskBase("abc"), 1000 * 6));//测试任务需要下边代码执行,线上不用Thread.sleep(10 * 1000);}}

springboot延时任务相关推荐

  1. RocketMQ 延时消息的使用和延时级别的配置

    1. 延时消息的使用场景 比如电商里,提交了一个订单就可以发送一个延时消息,1h后去检查这个订单的状态,如果还是未付款就取消订单释放库存. 2. 延时消息的使用限制 // org/apache/roc ...

  2. RabbitMQ第二话 -- Springboot基于四种Exchange(Direct、Fanout、Topic、Heders、延时队列)的实现和多虚拟主机下的生产消费者实现

    本文主要分享RabbitMQ exchange类型的功能和使用.RabbitMQ延时队列.一个springboot服务发送消息到多虚拟主机 1.RabbitMQ exchange exchange交换 ...

  3. springboot 与rabbitmq集成+生产者投递确认+消费者手动确认+TTL+死信队列+延时队列

    1.生产者的消息可靠性投递机制 1)springboot yml文件配置 spring:rabbitmq:host: 10.0.23.83username: lifwepassword: 123456 ...

  4. Springboot集成rabbitmq实现延时队列

    Springboot集成rabbitmq实现延时队列 什么是延时队列? 列举几个使用场景: 常见的种类有: 延时任务-实现方式: 详细信息:[https://www.cnblogs.com/JonaL ...

  5. springboot整合rocketMQ记录 实现发送普通消息,延时消息

    一.为什么选择RocketMQ消息队列?(可跳过看三的整合代码实例) 首先RocketMQ是阿里巴巴自研出来的,也已开源.其性能和稳定性从双11就能看出来,借用阿里的一句官方介绍:历年双 11 购物狂 ...

  6. 【SpringBoot】43、SpringBoot中整合RabbitMQ实现延时队列(延时插件篇)

    死信队列实现篇,参考文章:[SpringBoot]60.SpringBoot中整合RabbitMQ实现延时队列(死信队列篇) 一.介绍 1.什么是延时队列? 延时队列即就是放置在该队列里面的消息是不需 ...

  7. SpringBoot 整合:Redis延时队列的简单实现(基于有赞的设计)

    点击关注公众号,Java干货及时送达 来源:blog.csdn.net/qq330983778/article/details/99341671 设计 之前学习Redis的时候发现有赞团队之前分享过一 ...

  8. SpringBoot——@Scheduled的自定义周期性线程池解决任务延时执行问题

    关注微信公众号:CodingTechWork,一起学习进步. 问题   在使用Spring中的@Scheduled注解设置定时任务时,遇到这样2个问题: 定时任务未按时执行,现象是延后了一段时间才执行 ...

  9. java 延时发送邮件_基于SpringBoot实现定时发送邮件过程解析

    前提: 1.springboot项目 2.引入maven 依赖 org.springframework.boot spring-boot-starter-mail 以下代码中涉及到的maven依赖有日 ...

最新文章

  1. 2012需要分析的一些技术(1)
  2. Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper
  3. 【计算理论】计算理论总结 ( 图灵机设计 ) ★★
  4. PHP读取excel表格内容 PHP-ExcelReader
  5. jquery学习手记(3)属性
  6. windows下 VScode+CMake+Linux远程调试
  7. 为了适应云数据库mySQL产品_为了适应不同的应用场景,云数据库mysql版提供的产品系列包括哪些...
  8. Erwin 生成 mysql 带注释(comment )的脚本
  9. 关于组策略软件限制策略规则
  10. 计算机网络-网络应用
  11. Java多线程学习十三:synchronized 和 Lock 区别以及孰优孰劣,如何选择?
  12. 达内python第二阶段月考_Python编程练习题二
  13. 一个华为人辞职创业后的几个反思【转】
  14. 西威驱动板PV33-4 电源驱动板图纸 37千瓦左右基本一样 文件发送非实物
  15. 关于.length与.length()的问题
  16. torch.ge()函数解读
  17. VB 四言古诗词赏析 制作
  18. c语言读取ascii文件,C++对ASCII文件的读写操作
  19. 用C语言算两个数的商和
  20. 学习笔记 JavaScript 动画 加速

热门文章

  1. “第二届中国软件杯”比赛
  2. DataStore入门及在项目中的使用
  3. HTML 音频/视频参考手册
  4. 考研那些事——那些年,我们一起度过的猪狗不如的生活
  5. OpenCV 调用网络摄像头
  6. Redis双写一致性
  7. SAN交换机配置一些原则
  8. Spring中所使用的设计模式
  9. java日期时间库-常用案例-不保留全分享
  10. LINUX在中国的前景