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. P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】

    正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 \(T\)组询问,给出\(n,k\)求 \[\sum_{i=0}^{k}\binom{n}{i} ...

  2. python读Excel方法(xlrd)

    在我们做平常工作或自动化测试中都会遇到操作excel,Python处理exc相当顺手,如何通过python操作excel,当然python操作excel的库有很多,比如pandas,xlwt/xlrd ...

  3. bootstrap inputfile 使用-上传,回显

    近期用bootstrap 做前端的上传,功能涉及到上传时就是召网上的教程随便弄一搜一大把,但是做到修改页面时候不知道页面该如何回显,折腾了一阵子才完成遂记录下来希望能给看到的小伙伴有点启发吧. 首先是 ...

  4. SDOI2015 排序

    SDOI2015 排序 今天看到这道题,没有一点思路,暴力都没的打...还是理解错题意了,操作不同位置不是说改不同的区间,而是不同操作的顺序...考场上如果知道这个的话最少暴力拿一半啊,因为正解本来就 ...

  5. 从零入门 Serverless | 课时5 函数的调试与部署

    作者 | 江昱 阿里巴巴高级产品经理 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 S ...

  6. css3新增属性-background背景

    css3新增属性 边框属性 背景属性 文字属性 颜色属性 背景属性 属性 说明 background-image 添加背景图片 background-size 指定背景图像的大小 background ...

  7. HTML5元素背景知识

    目录 HTML5元素背景知识 语义与呈现分离 元素选用原则 少亦可为多 别误用元素 具体为佳,一以贯之 对用户不要想当然 元素说明体例 ol元素 元素速览 文档和元数据元素 文档和元数据元素 文本元素 ...

  8. 2021北航敏捷软工Beta阶段评分与总结

    概述 Beta 阶段评分,按照之前的规则,主要组成部分为: 博客部分,基于 Beta 阶段博客的评分(每篇正规博客 10 分,每篇 Scrum5 分,评定方式类比往年) 评审部分,基于 Beta 阶段 ...

  9. 第三次Scrum Metting

    日期:2021年4月27日会议主要内容概述:确定后端和前端接口,前端讨论画图页面,解决两处画图问题 一.进度情况# 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 ...

  10. UltraSoft - Alpha - Postmortem 事后分析

    Alpha阶段 Postmortem会议 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 主要是解决DDL提醒功能的问题,定义的比较清楚,对典型用户和典 ...