我的编程空间,编程开发者的网络收藏夹
学习永远不晚

rabbitmq怎么在springboot中使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

rabbitmq怎么在springboot中使用

rabbitmq怎么在springboot中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

概述

  1. RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,或者简单地将作业队列以便让分布式服务器进行处理。

  2. 它现实了AMQP协议,并且遵循Mozilla Public License开源协议,它支持多种语言,可以方便的和spring集成。

  3. 消息队列使用消息将应用程序连接起来,这些消息通过像RabbitMQ这样的消息代理服务器在应用程序之间路由。

基本概念

Broker

用来处理数据的消息队列服务器实体

vhost

由RabbitMQ服务器创建的虚拟消息主机,拥有自己的权限机制,一个broker里可以开设多个vhost,用于不同用户的权限隔离,vhost之间是也完全隔离的。

productor

产生用于消息通信的数据

channel

消息通道,在AMQP中可以建立多个channel,每个channel代表一个会话任务。

exchange

direct

转发消息到routing-key指定的队列

rabbitmq怎么在springboot中使用fanout

fanout

转发消息到所有绑定的队列,类似于一种广播发送的方式。

rabbitmq怎么在springboot中使用topic

topic

按照规则转发消息,这种规则多为模式匹配,也显得更加灵活

rabbitmq怎么在springboot中使用queue

queue

  1.  队列是RabbitMQ的内部对象,存储消息

  2. 以动态的增加消费者,队列将接受到的消息以轮询(round-robin)的方式均匀的分配给多个消费者。

binding

表示交换机和队列之间的关系,在进行绑定时,带有一个额外的参数binding-key,来和routing-key相匹配。

consumer

监听消息队列来进行消息数据的读取

springboot下三种Exchange模式(fanout,direct,topic)实现

pom.xml中引用spring-boot-starter-amqp

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-amqp</artifactId></dependency>

增加rabbitmq配置

spring:  rabbitmq:  host: localhost  port: 5672  username: guest  password: guest

direct

direct模式一般情况下只需要定义queue 使用自带交换机(defaultExchange)无需绑定交换机

  @Configurationpublic class RabbitP2PConfigure {   public static final String QUEUE_NAME = "p2p-queue";  @Bean  public Queue queue() {    return new Queue(QUEUE_NAME, true);  }}
@RunWith(SpringRunner.class)@SpringBootTest(classes = BootCoreTestApplication.class)@Slf4jpublic class RabbitTest {  @Autowired  private AmqpTemplate amqpTemplate;    @Test  public void sendLazy() throws InterruptedException {    City city = new City(234556666L, "direct_name", "direct_code");    amqpTemplate.convertAndSend(RabbitLazyConfigure.QUEUE_NAME, city);  }      @Test  public void receive() throws InterruptedException {    Object obj = amqpTemplate.receiveAndConvert(RabbitLazyConfigure.QUEUE_NAME);    Assert.notNull(obj, "");    log.debug(obj.toString());  }}

适用场景:点对点

fanout

fanout则模式需要将多个queue绑定在同一个交换机上

@Configurationpublic class RabbitFanoutConfigure {  public static final String EXCHANGE_NAME = "fanout-exchange";  public static final String FANOUT_A = "fanout.A";  public static final String FANOUT_B = "fanout.B";  public static final String FANOUT_C = "fanout.C";  @Bean  public Queue AMessage() {    return new Queue(FANOUT_A);  }  @Bean  public Queue BMessage() {    return new Queue(FANOUT_B);  }  @Bean  public Queue CMessage() {    return new Queue(FANOUT_C);  }  @Bean  public FanoutExchange fanoutExchange() {    return new FanoutExchange(EXCHANGE_NAME);  }  @Bean  public Binding bindingExchangeA(Queue AMessage, FanoutExchange fanoutExchange) {    return BindingBuilder.bind(AMessage).to(fanoutExchange);  }  @Bean  public Binding bindingExchangeB(Queue BMessage, FanoutExchange fanoutExchange) {    return BindingBuilder.bind(BMessage).to(fanoutExchange);  }  @Bean  public Binding bindingExchangeC(Queue CMessage, FanoutExchange fanoutExchange) {    return BindingBuilder.bind(CMessage).to(fanoutExchange);  }}

发送者

@Slf4jpublic class Sender {  @Autowired  private AmqpTemplate rabbitTemplate;  public void sendFanout(Object message) {    log.debug("begin send fanout message<" + message + ">");    rabbitTemplate.convertAndSend(RabbitFanoutConfigure.EXCHANGE_NAME, "", message);  }}

我们可以通过@RabbitListener监听多个queue来进行消费

@Slf4j@RabbitListener(queues = {    RabbitFanoutConfigure.FANOUT_A,    RabbitFanoutConfigure.FANOUT_B,    RabbitFanoutConfigure.FANOUT_C})public class Receiver {  @RabbitHandler  public void receiveMessage(String message) {    log.debug("Received <" + message + ">");  }}

适用场景
- 大规模多用户在线(MMO)游戏可以使用它来处理排行榜更新等全局事件
- 体育新闻网站可以用它来近乎实时地将比分更新分发给移动客户端
- 分发系统使用它来广播各种状态和配置更新
- 在群聊的时候,它被用来分发消息给参与群聊的用户

topic

这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”,Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列。

在进行绑定时,要提供一个该队列关心的主题,如“topic.# (“#”表示0个或若干个关键字,“*”表示一个关键字。 )

@Configurationpublic class RabbitTopicConfigure {  public static final String EXCHANGE_NAME = "topic-exchange";  public static final String TOPIC = "topic";  public static final String TOPIC_A = "topic.A";  public static final String TOPIC_B = "topic.B";  @Bean  public Queue queueTopic() {    return new Queue(RabbitTopicConfigure.TOPIC);  }  @Bean  public Queue queueTopicA() {    return new Queue(RabbitTopicConfigure.TOPIC_A);  }  @Bean  public Queue queueTopicB() {    return new Queue(RabbitTopicConfigure.TOPIC_B);  }  @Bean  public TopicExchange exchange() {    TopicExchange topicExchange = new TopicExchange(EXCHANGE_NAME);    topicExchange.setDelayed(true);    return new TopicExchange(EXCHANGE_NAME);  }  @Bean  public Binding bindingExchangeTopic(Queue queueTopic, TopicExchange exchange) {    return BindingBuilder.bind(queueTopic).to(exchange).with(RabbitTopicConfigure.TOPIC);  }  @Bean  public Binding bindingExchangeTopics(Queue queueTopicA, TopicExchange exchange) {    return BindingBuilder.bind(queueTopicA).to(exchange).with("topic.#");  }}

同时去监听三个queue

@Slf4j@RabbitListener(queues = {    RabbitTopicConfigure.TOPIC,    RabbitTopicConfigure.TOPIC_A,    RabbitTopicConfigure.TOPIC_B})public class Receiver {  @RabbitHandler  public void receiveMessage(String message) {    log.debug("Received <" + message + ">");  }}

通过测试我们可以发现

@RunWith(SpringRunner.class)@SpringBootTest(classes = BootCoreTestApplication.class)public class RabbitTest {  @Autowired  private AmqpTemplate rabbitTemplate;  @Test  public void sendAll() {    rabbitTemplate.convertAndSend(RabbitTopicConfigure.EXCHANGE_NAME, "topic.test", "send All");  }  @Test  public void sendTopic() {    rabbitTemplate.convertAndSend(RabbitTopicConfigure.EXCHANGE_NAME, RabbitTopicConfigure.TOPIC, "send Topic");  }  @Test  public void sendTopicA() {    rabbitTemplate.convertAndSend(RabbitTopicConfigure.EXCHANGE_NAME, RabbitTopicConfigure.TOPIC_A, "send TopicA");  }}

适用场景
- 分发有关于特定地理位置的数据,例如销售点
- 由多个工作者(workers)完成的后台任务,每个工作者负责处理某些特定的任务
- 股票价格更新(以及其他类型的金融数据更新)
- 涉及到分类或者标签的新闻更新(例如,针对特定的运动项目或者队伍)
- 云端的不同种类服务的协调
- 分布式架构/基于系统的软件封装,其中每个构建者仅能处理一个特定的架构或者系统。

延迟队列

延迟消费:

  1. 如用户生成订单之后,需要过一段时间校验订单的支付状态,如果订单仍未支付则需要及时地关闭订单。

  2. 用户注册成功之后,需要过一段时间比如一周后校验用户的使用情况,如果发现用户活跃度较低,则发送邮件或者短信来提醒用户使用。

延迟重试:

  1. 如消费者从队列里消费消息时失败了,但是想要延迟一段时间后自动重试。

  2. 如果不使用延迟队列,那么我们只能通过一个轮询扫描程序去完成。这种方案既不优雅,也不方便做成统一的服务便于开发人员使用。但是使用延迟队列的话,我们就可以轻而易举地完成。

设置交换机延迟属性为true

@Configurationpublic class RabbitLazyConfigure {  public static final String QUEUE_NAME = "lazy-queue-t";  public static final String EXCHANGE_NAME = "lazy-exchange-t";  @Bean  public Queue queue() {    return new Queue(QUEUE_NAME, true);  }  @Bean  public DirectExchange defaultExchange() {    DirectExchange directExchange = new DirectExchange(EXCHANGE_NAME, true, false);    directExchange.setDelayed(true);    return directExchange;  }  @Bean  public Binding binding() {    return BindingBuilder.bind(queue()).to(defaultExchange()).with(QUEUE_NAME);  }}

发送时设置延迟时间即可

@Slf4jpublic class Sender {  @Autowired  private AmqpTemplate rabbitTemplate;  public void sendLazy(Object msg) {    log.debug("begin send lazy message<" + msg + ">");    rabbitTemplate.convertAndSend(RabbitLazyConfigure.EXCHANGE_NAME,        RabbitLazyConfigure.QUEUE_NAME, msg, message -> {          message.getMessageProperties().setHeader("x-delay", 10000);          return message;        }    );  }}

看完上述内容,你们掌握rabbitmq怎么在springboot中使用的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

rabbitmq怎么在springboot中使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

rabbitmq怎么在springboot中使用

rabbitmq怎么在springboot中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。概述RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的
2023-05-30

怎么使用springboot + rabbitmq消息确认机制

这篇文章主要介绍“怎么使用springboot + rabbitmq消息确认机制”,在日常操作中,相信很多人在怎么使用springboot + rabbitmq消息确认机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
2023-06-02

怎么在SpringBoot中使用nacos

怎么在SpringBoot中使用nacos?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、什么是nacosnacos支持基于dns和基于rpc的服务发现,可以作为spri
2023-06-15

怎么在Springboot中使用mybatis

今天就跟大家聊聊有关怎么在Springboot中使用mybatis,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前期工作1.导入mybatis整合依赖
2023-06-20

Redisson怎么在SpringBoot中使用

今天就跟大家聊聊有关Redisson怎么在SpringBoot中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Redisson、Jedis、Lettuce优缺点对比(1)Redi
2023-06-15

Banner怎么在SpringBoot中使用

今天就跟大家聊聊有关Banner怎么在SpringBoot中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Spring Boot在启动项目时,控制台会打印一个Spring的log
2023-05-30

Springboot怎么整合RabbitMQ

本篇文章给大家分享的是有关Springboot怎么整合RabbitMQ,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。准备工作15minIDEAmaven 3.0在开始构建项目之
2023-06-19

在springboot中怎么使用拦截器

这篇文章主要介绍“在springboot中怎么使用拦截器”,在日常操作中,相信很多人在在springboot中怎么使用拦截器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”在springboot中怎么使用拦截器
2023-06-26

SpringBoot中使用RabbitMQ的RPC功能案例分析

这篇文章主要讲解了“SpringBoot中使用RabbitMQ的RPC功能案例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot中使用RabbitMQ的RPC功能案例分析
2023-06-25

idea在springboot中怎么使用lombok插件

这篇文章主要讲解了“idea在springboot中怎么使用lombok插件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“idea在springboot中怎么使用lombok插件”吧!在id
2023-06-20

怎么使用Spring integration在Springboot中集成Mqtt

今天小编给大家分享一下怎么使用Spring integration在Springboot中集成Mqtt的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下
2023-07-05

怎么在SpringBoot中使用Mockito单元测试

这期内容当中小编将会给大家带来有关怎么在SpringBoot中使用Mockito单元测试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Mock 测试Mock 测试就是在测试过程中,创建一个假的对象,避免你
2023-06-15

怎么用SpringBoot+RabbitMQ实现消息可靠传输

这篇文章主要介绍了怎么用SpringBoot+RabbitMQ实现消息可靠传输的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用SpringBoot+RabbitMQ实现消息可靠传输文章都会有所收获,下面我们
2023-06-30

怎么使用.NETCore操作RabbitMQ

这篇文章将为大家详细讲解有关怎么使用.NETCore操作RabbitMQ,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是RabbitMQ?RabbitMQ是由erlang语言开发的一个基于AMQP(A
2023-06-15

SpringBoot中怎么使用WebSocket

在Spring Boot中使用WebSocket可以通过以下步骤实现:首先添加WebSocket依赖:在pom.xml文件中添加以下依赖:org.springframework.boot
SpringBoot中怎么使用WebSocket
2024-03-07

SpringBoot中怎么使用@ConfigurationProperties

这篇文章主要介绍“SpringBoot中怎么使用@ConfigurationProperties”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot中怎么使用@Configuratio
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录