1. 概述

老话说的好:对待工作要有责任心,不仅要完成自己的部分,还要定期了解整体的进展。

言归正传,我们在开发产品时,常常会遇到一段时间后检查状态的场景,例如:用户下单场景,如果订单生成30分钟后,用户还没有完成支付,则系统自动将订单关闭。

在没有消息中间件之前,常常是启动一个定时程序,固定间隔的去检查,不仅耗费系统资源,还会有较大的时间误差。

今天我们就来聊一下 RabbitMQ 的 延迟消息 功能的使用。

RabbitMQ 镜像模式集群的搭建,可参见我的另一篇文章《RabbitMQ 3.9.7 镜像模式集群的搭建》(https://www.cnblogs.com/w84422/p/15356202.html

在早期的 SpringCloud 版本中常使用 @Input、@Output、@EnableBinding 和 @StreamListener 注解开发生产者与消费者。

官方原文:Deprecated as of 3.1 in favor of functional programming model。

SpringCloud 2020.0.4 版本中,已经不推荐这么开发了,因此这里我们也使用新的写法(函数式编程方式) 开发。

闲话不多说,直接上代码。

2. 延迟消息插件的安装

2.1 下载插件 

可以到 RabbitMQ 的官网下载,选择与安装的 RabbitMQ 对应的版本

官网地址:https://www.rabbitmq.com/community-plugins.html

2.2  解压插件

将插件 .ez 后缀名改为 .zip,然后使用 unzip 命令解压。

2.3  拷贝插件到 RabbitMQ 的 plugins 文件夹下

如果是用 rpm 包的方式安装的 RabbitMQ,路径为: /usr/lib/rabbitmq/lib/rabbitmq_server-3.9.7/plugins

如果是 Docker 安装,则 Docker 容器内的路径为:/plugins

2.4 启用延迟消息插件

# rabbitmq-plugins enable rabbitmq_delayed_message_exchange

2.5 重启 RabbitMQ

# /sbin/service rabbitmq-server stop

# /sbin/service rabbitmq-server start

3. 延迟消息发送DEMO

3.1 主要依赖

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 健康检查 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

3.2 消息实体类

@Setter
@Getter
public class MyMessage implements java.io.Serializable { // 消息体
private String payload;
}

3.3 生产者

    // 发送延迟消息
@PostMapping("/delayed")
public String sendDelayedMessage(@RequestParam("body") String body,
@RequestParam("seconds") Integer seconds) { MyMessage myMessage = new MyMessage();
myMessage.setPayload(body); // 生产消息
// 第一个参数是绑定名称,格式为:自定义的绑定名称-out-0,myDelayed是自定义的绑定名称,out代表生产者,0是固定写法
// 自定义的绑定名称必须与消费方法的方法名保持一致
// 第二个参数是发送的消息实体
streamBridge.send("myDelayed-out-0",
MessageBuilder.withPayload(myMessage)
.setHeader("x-delay", seconds * 1000)
.build()
);
log.info("发送延迟消息成功");
return "SUCCESS";
}

3.4 消费者

    // 消费延迟消息
@Bean
public Consumer<Message<MyMessage>> myDelayed() { // 方法名必须与生产消息时自定义的绑定名称一致 return message -> {
log.info("接收延迟消息:{}", message.getPayload().getPayload());
};
}

3.5 application.yml 配置

spring:
application:
name: my-stream-new
rabbitmq: # RabbitMQ 配置
addresses: 192.168.1.12:5672
username: guest
password: guest
virtual-host: /
connection-timeout: 16000
cloud:
function:
# 定义消费者,多个用分号分隔,当存在大于1个的消费者时,不定义不会生效
definition: myDelayed
stream:
bindings:
# 延迟消息
myDelayed-in-0: # 消费者绑定名称,myDelayed是自定义的绑定名称,in代表消费者,0是固定写法
destination: my-delayed-topic # 对应的真实的 RabbitMQ Exchange
myDelayed-out-0: # 生产者绑定名称,myDelayed是自定义的绑定名称,out代表生产者,0是固定写法
destination: my-delayed-topic # 对应的真实的 RabbitMQ Exchange rabbit:
bindings:
myDelayed-in-0:
consumer:
delayedExchange: true # 开启延迟功能
myDelayed-out-0:
producer:
delayedExchange: true # 开启延迟功能

3.6 验证延迟消息

发送延迟消息接口:

POST http://localhost:49000/stream/delayed?body=这是一条延迟消息!&seconds=10

自动生成的 Exchange

自动生成的 Queue

消费情况

4. 综述

今天聊了一下 SpringCloud Stream 组件 延迟消息 的实现 ,希望可以对大家的工作有所帮助。

欢迎帮忙点赞、评论、转发、加关注 :)

关注追风人聊Java,每天更新Java干货。

5. 个人公众号

追风人聊Java,欢迎大家关注

 

SpringCloud 2020.0.4 系列之 Stream 延迟消息 的实现的更多相关文章

  1. SpringCloud 2020.0.4 系列之 Stream 消息广播 与 消息分组 的实现

    1. 概述 老话说的好:事情太多,做不过来,就先把事情记在本子上,然后理清思路.排好优先级,一件一件的去完成. 言归正传,今天我们来聊一下 SpringCloud 的 Stream 组件,Spring ...

  2. SpringCloud 2020.0.4 系列之 Stream 消息出错重试 与 死信队列 的实现

    1. 概述 老话说的好:出错不怕,怕的是出了错,却不去改正.如果屡次出错,无法改对,就先记下了,然后找援军解决. 言归正传,今天来聊一下 Stream 组件的 出错重试 和 死信队列. RabbitM ...

  3. SpringCloud 2020.0.4 系列之 Feign

    1. 概述 老话说的好:任何问题都有不止一种的解决方法,当前的问题没有解决,只是还没有发现解决方法,而并不是无解. 言归正传,之前我们聊了 SpringCloud 的服务治理组件 Eureka,今天我 ...

  4. SpringCloud 2020.0.4 系列之Eureka

    1. 概述 老话说的好:遇见困难,首先要做的是积极的想解决办法,而不是先去泄气.抱怨或生气. 言归正传,微服务是当今非常流行的一种架构方式,其中 SpringCloud 是我们常用的一种微服务框架. ...

  5. SpringCloud 2020.0.4 系列之服务降级

    1. 概述 老话说的好:做人要正直,做事要正派,胸怀坦荡.光明磊落,才会赢得他人的信赖与尊敬. 言归正传,之前聊了服务间通信的组件 Feign,今天我们来聊聊服务降级. 服务降级简单的理解就是给一个备 ...

  6. SpringCloud 2020.0.4 系列之 Bus

    1. 概述 老话说的好:会休息的人才更会工作,身体是革命的本钱,身体垮了,就无法再工作了. 言归正传,之前我们聊了 SpringCloud 的 分布式配置中心 Config,文章里我们聊了config ...

  7. SpringCloud 2020.0.4 系列之 Gateway入门

    1. 概述 老话说的好:做人要有幽默感,懂得幽默的人才会活的更开心. 言归正传,今天我们来聊聊 SpringCloud 的网关组件 Gateway,之前我们去访问 SpringCloud 不同服务的接 ...

  8. SpringCloud 2020.0.4 系列之Hystrix看板

    1. 概述 老话说的好:沉默是金,有时适当的沉默,比滔滔不绝更加有效. 言归正传,前面我们聊了有关 Hystrix 降级熔断的话题,今天我们来聊聊如何使用 turbine 和 hystrix dash ...

  9. SpringCloud 2020.0.4 系列之 JWT用户鉴权

    1. 概述 老话说的好:善待他人就是善待自己,虽然可能有所付出,但也能得到应有的收获. 言归正传,之前我们聊了 Gateway 组件,今天来聊一下如何使用 JWT 技术给用户授权,以及如果在 Gate ...

随机推荐

  1. Sentry 监控 - Alerts 告警

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  2. B站视频:【Creator3】好玩的编队代码 魔性排列停不下来 附源码及出处

    这次带来一个有趣的编队代码,简单的算法得到令人惊叹的编队队形,叹为观止,前几天刷视频的时候看到一个有趣的展示,来自youtube大神:Tarodev的队形计算展示< Fun with Forma ...

  3. List接口常用实现类对比

    相同点 都实现了List接口 储存了有序 可重复的数据 不同点 ArrayList 线程不安全 但是效率高 底层使用 Object[] elementData 实现 LinkedList 底层使用双向 ...

  4. 迁移appseting.json创建自定义配置中心

    创建一个自定义的配置中心,将框架中各类配置,迁移至数据库,支持切换数据库,热重载. 说在前面的话 自使用.net Core框架以来,配置大多存在json文件中: [框架默认加载配置]文件为appset ...

  5. 如何迁移 Spring Boot 到函数计算

    作者 | 田小单 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上 ...

  6. 阿里云研究员叔同:Serverless 正当时!

    作者 | 叔同 导读:Serverless 将开发人员从繁重的手动资源管理和性能优化中解放出来,就像数十年前汇编语言演变到高级语言的过程一样,云计算生产力再一次发生变革.Serverless 的核心价 ...

  7. 重磅 | 阿里开源首个 Serverless 开发者平台 Serverless Devs

    Serverless 从概念提出到应用,已经走过了 8 个年头,开发者对 Serverless 的使用热情不断高涨.为帮助开发者实现一键体验多云产品,极速部署 Serverless 项目,10 月 2 ...

  8. 036—环境变量path

    day04 课堂笔记 1.开发第一个java程序:HelloWorld 1.1.程序写完以后,一定要ctrl+s进行保存 源代码若修改,需重新进行编译 1.2.编译阶段 怎么编译?使用什么命令?这个命 ...

  9. UI自动化测试之Airtest

    官方文档: https://airtest.doc.io.netease.com/ 本文我们讲解下Airtest的使用,主要学习目标有以下几点: (1)认识Airtest (2)了解Airtest能做 ...

  10. python png图片生成gif

    有时候写代码就是这样别人把代码写好你在后面加一个句号就行了 我很懒不想写成函数,你自己来吧.有注释就不错了 这个依赖一个图像处理库pillow,轮子就是轮他不是车 import imageio imp ...