酷站(www.ku0.com)-致力于为互联网从业者提供动力!

热门关键词:  企业  as  baidu  c4rp3nt3r  美女
【阿里云】采购季上云仅¥223/3年

SpringBoot下RabbitMq实现定时任务

来源:互联网搜集 作者:秩名 人气: 发布时间:2019-11-03
本篇文章主要介绍了SpringBoot下RabbitMq实现定时任务,对大家的学习或者工作具有一定的参考学习价值,感兴趣的小伙伴们可以参考一下,也感谢大家对酷站(ku0.com)的支持。

定时任务场景:订单下单15分钟未付款自动关闭

延迟任务实现原理图如下:


 

根据上图看出我们需要两个队列(一是死信队列,消息在里面度过TLL时间,二是处理队列,消息度过TLL时间后进入该队列),两个交换机和路由(一是用来将消息送入死信队列,二是将消息从死信队列送到处理队列),但是交换机其实可以用同一个,也就是一个交换机搭配两个路由的方式。

以下为代码实现过程:
 

//首先rabbitAdmin的配置
 @Bean
 public RabbitAdmin rabbitAdmin(CachingConnectionFactory cachingConnectionFactory){
 RabbitAdmin rabbitAdmin = new RabbitAdmin(cachingConnectionFactory);
 rabbitAdmin.setIgnoreDeclarationExceptions(true);
 return rabbitAdmin;
 }
 

然后是队列交换机以及绑定的声明(Queue,Exchange,Binding)

@Autowired
 RabbitAdmin rabbitAdmin;
 
 /**
 * 创建延迟队列,该队列内容不会呗监听,TLL到期自动转发
 * @param queueName
 * @param delayExchange
 */
 public void createDelayQueue(String queueName,String delayExchange,String delayRoutingKey){
 Map<String, Object> map = new HashMap<>();
 /**注意这两个参数必须绑定**/
 map.put("x-dead-letter-exchange", delayExchange);
 map.put("x-dead-letter-routing-key", delayRoutingKey);
 rabbitAdmin.declareQueue(new Queue(queueName,true,false,false,map));
 }
 
 /**
 * 创建普通队列
 * @param queueName
 */
 public void createQueue(String queueName){
 rabbitAdmin.declareQueue(new Queue(queueName,true,false,false,new HashMap<>()));
 }
 /**
 * 创建延迟队列得交换机,就是一个普通得交换机
 * @param name
 */
 public void createExchange(String name){
 rabbitAdmin.declareExchange(new DirectExchange(name,true,false));
 }
 
 /**
 * 绑定队列
 * @param queueName
 * @param delayExchange
 * @param routeKey
 */
 public void bindQueue(String queueName,String delayExchange,String routeKey){
 rabbitAdmin.declareBinding(new Binding(queueName,Binding.DestinationType.QUEUE,delayExchange,routeKey,new HashMap<>()));
 }
 
 /**
 * 发送消息
 * @param message
 * @param exchange
 * @param routeKey
 * @param tll 时间 单位毫秒
 */
 public void sendMessageWithTll(String message,String exchange,String routeKey,String tll){
 rabbitAdmin.getRabbitTemplate().convertAndSend(exchange, routeKey, message, new MessagePostProcessor() {
  @Override
  public Message postProcessMessage(Message message) throws AmqpException {
  message.getMessageProperties().setExpiration(tll);
  return message;
  }
 });
 }
 
 @Override
 public void sendMessage(String message, String exchange, String routeKey) {
 rabbitAdmin.getRabbitTemplate().convertAndSend(exchange, routeKey, message, new MessagePostProcessor() {
  @Override
  public Message postProcessMessage(Message message) throws AmqpException {
  return message;
  }
 });
 }

进行测试

/**
 * 监听消息
 * @param message
 * @return
 */
 @RabbitListener(queues = "consumerQueue")
 public void getMessage(String message){
 System.out.println("收到消息getMessage:"+message +",time="+MyUtil.FormatDate(new Date()));
 }

版权声明:本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 959677720#qq.cn(#换@) 举报,一经查实,本站将立刻删除。
原文链接:https://blog.csdn.net/u011554976/article/details/92095025

相关文章

  • Mybatis版本升级踩坑及背后原理的介绍

    Mybatis版本升级踩坑及背后原理的介绍

    1、背景 某一天的晚上,系统服务正在进行常规需求的上线,因为发布时,提示统一的pom版本需要升级,于是从 1.3.9.6 升级至 1.4.2.1。 当服务开始上线后,开始陆续出现了一些更新系统交互日志方面的报警,属于系统辅助流程,报警下图所示,......
    05-17
  • SpringBoot使用Redis实现分布式锁的方法

    SpringBoot使用Redis实现分布式锁的方法

    前言 在单机应用时代,我们对一个共享的对象进行多线程访问的时候,使用java的synchronized关键字或者ReentrantLock类对操作的对象加锁就可以解决对象的线程安全问题。 分布式应用时代这个方法却行不通了,我们的应用可能被部署到多台机......
    05-16
  • System.currentTimeMillis()计算方式与时间的单位转换

    System.currentTimeMillis()计算方式与时间的单位转换

    一、时间的单位转换 1秒=1000毫秒(ms)1毫秒=1/1,000秒(s) 1秒=1,000,000微秒(s)1微秒=1/1,000,000秒(s) 1秒=1,000,000,000纳秒(ns)1纳秒=1/1,000,000,000秒(s) 1秒=1,000,000,000,000皮秒(ps)1皮秒=1/1,000,000,000,000秒(s) 1分钟=6......
    05-15
  • java中构造器内部调用构造器的介绍

    java中构造器内部调用构造器的介绍

    可能为一个类写了多个构造器,有时可能想在一个构造器里面调用另外一个构造器,为了减少代码的重复,可用this关键字做到这一点。 public class Flower { private String string; private int age; public Flower() { // 先调用public Flo......
    05-10
  • JMETER用户变量作用域测试流程

    JMETER用户变量作用域测试流程

    在编写JMETER 脚本时,我们会使用到变量,变量的作用域是线程。 我们通过下面的脚本验证一下变量的返回是线程。 1. 我们先定义一个amount的流程变量。 2.线程组使用三个线程 3.在线程组中添加一个循环控制器,执行次数为3. 增加一个循环......
    05-09
  • 为什么SpringBoot的jar可以直接运行?

    为什么SpringBoot的jar可以直接运行?

    SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。在pom文件里加入这个插件即可: build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId ......
    05-09
  • Springmvc和ajax实现前后端交互

    Springmvc和ajax实现前后端交互

    springmvc使用@RequestBody来获取前端的json字符串并转化为java对象 使用@ReponseBody来将返回的java对象转换为json形式返回前端 下面是几个使用springmvc和ajax进行前后端交互的简单实例 1.传递简单对象: 前端: $(function(){ $(#btn3......
    05-06
  • Spring替换掉默认common-logging.jar的方法

    Spring替换掉默认common-logging.jar的方法

    为什么使用日志打印而不是使用System.out.println()? System.out是一个io流 如果使用它打印大批量数据 会占用大量的资源 spring默认使用common-logging打印日志信息 如果我们想替换掉它 使用其他的日志工具 分为如下几步 1.排除项目对co......
    05-06
  • 将ResultSet中得到的一行或多行结果集封装成对象

    将ResultSet中得到的一行或多行结果集封装成对象

    首先说一下这个使用场景,我们在使用jdbc连接数据库的时候,执行查询语句时候会得到一个结果集,如果想要再获取这个结果集中的值,就需要我们将他转换成一个对象,然后通过对象的get和set方法来获取到数据库中的值。 public class BaseDa......
    05-03
  • Java Lock锁多线程中实现流水线任务的介绍

    Java Lock锁多线程中实现流水线任务的介绍

    下面程序代码通过使用Lock锁执行简单的流水线任务: import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; /** * @author lzq * @data 2020/4/29 002......
    05-01

最新更新