先决条件

  1. rabbitmq server 安装参考
  2. 一个添加了 web 依赖的 spring boot 项目 我的版本是 2.5.2

添加 maven 依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-amqp</artifactId>
  4. </dependency>

配置 application.yml

  1. spring:
  2. rabbitmq:
  3. host: [此处填写 rabbitmq 服务地址(ip/domain),不包括[]]
  4. port: [此处填写 rabbitmq 服务端口(默认是 5672),不包括[]]
  5. username: [此处填写用户名,不包括[]]
  6. password: [此处填写密码,不包括[]]

添加 config bean

这里面只需要配置 MessageConverter,其他的可以不用配置,它的作用是:

  1. 发布消息时,将 java bean 序列化为 rabbitmq 的消息
  2. 消费消息时,将 rabbitmq 消息反序列化为 java bean

如果你只用简单类型发布和接收消息,就大可不必配置这个了

  1. package com.xx.config;
  2. import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
  3. import org.springframework.amqp.support.converter.MessageConverter;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. @Configuration
  7. public class RabbitMQConfig {
  8. /**
  9. * MessageConverter用于将Java对象转换为RabbitMQ的消息。
  10. *
  11. * 默认情况下,Spring Boot使用SimpleMessageConverter,只能发送String和byte[]类型的消息,不太方便。
  12. * 使用Jackson2JsonMessageConverter,我们就可以发送JavaBean对象,由Spring Boot自动序列化为JSON并以文本消息传递。
  13. *
  14. *
  15. * convertAndSend 可以发送 java bean,接收方也可也自动反序列化
  16. * https://www.liaoxuefeng.com/wiki/1252599548343744/1282385960239138
  17. * http://www.ityouknow.com/springboot/2016/11/30/spring-boot-rabbitMQ.html
  18. *
  19. * @return
  20. */
  21. @Bean
  22. MessageConverter createMessageConverter() {
  23. return new Jackson2JsonMessageConverter();
  24. }

配置队列

  1. 配置 exchange
  2. 配置 queue
  3. 配置 binding

配置好之后,会自动创建 exchangequeuebinding,不需要手动在 rabbitmq web management ui 中手动操作了。

这块配置代码如下:

Constant 类根据自己情况,要不要看你自己

  1. package com.xx.constant;
  2. public final class Constant {
  3. /**
  4. * rabbitmq
  5. */
  6. public static final class MQ {
  7. /**
  8. * XX 消息采用 Direct Exchange 模式
  9. */
  10. public static final class XX {
  11. private static final String namePrefix = "company-module-";
  12. private static final String routingKeyPrefix = "company_module_";
  13. private static final String create = "create";
  14. private static final String update = "update";
  15. public static final String exchange = namePrefix + "events";
  16. public static final class Queue {
  17. public static final String create = namePrefix + XX.create;
  18. public static final String update = namePrefix + XX.update;
  19. }
  20. public static final class RoutingKey {
  21. public static final String create = routingKeyPrefix + XX.create;
  22. public static final String update = routingKeyPrefix + XX.update;
  23. }
  24. }
  25. }
  26. }
  1. package com.xx.message.receiver.xx;
  2. import com.xx.constant.Constant;
  3. import org.springframework.amqp.core.Binding;
  4. import org.springframework.amqp.core.BindingBuilder;
  5. import org.springframework.amqp.core.DirectExchange;
  6. import org.springframework.amqp.core.Queue;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. @Configuration
  10. public class RabbitMQXXConfig {
  11. @Bean
  12. public DirectExchange xxExchange() {
  13. return new DirectExchange(Constant.MQ.XX.exchange, true, false);
  14. }
  15. @Bean
  16. public Queue xxCreateQueue() {
  17. return new Queue(Constant.MQ.XX.Queue.create, true, false, false);
  18. }
  19. @Bean
  20. public Queue xxUpdateQueue() {
  21. return new Queue(Constant.MQ.XX.Queue.update, true, false, false);
  22. }
  23. @Bean
  24. public Binding xxCreateBinding() {
  25. return BindingBuilder
  26. .bind(xxCreateQueue())
  27. .to(xxExchange())
  28. .with(Constant.MQ.XX.RoutingKey.create);
  29. }
  30. @Bean
  31. public Binding xxUpdateBinding() {
  32. return BindingBuilder
  33. .bind(xxUpdateQueue())
  34. .to(xxExchange())
  35. .with(Constant.MQ.XX.RoutingKey.update);
  36. }
  37. }

编写 messageReceiver

这里为了测试,把 createupdate 的消息接收器写了两个,实际一个就可以了

  1. package com.xx.message.receiver.xx;
  2. import com.xx.constant.Constant;
  3. import com.xx.exception.ServiceException;
  4. import com.xx.vo.xx.XXVo;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.amqp.rabbit.annotation.RabbitListener;
  7. import org.springframework.stereotype.Component;
  8. /**
  9. * XX 消息接收器
  10. */
  11. @Slf4j
  12. @Component
  13. public class RabbitMQXXMessageReceiver {
  14. @RabbitListener(queues = Constant.MQ.XX.Queue.create)
  15. public void onCreate1Message(XXVo message) {
  16. log.info("mq:xx-create1 received <{}>", message);
  17. // throw new ServiceException("报错模拟");
  18. }
  19. @RabbitListener(queues = Constant.MQ.XX.Queue.create)
  20. public void onCreate2Message(XXVo message) {
  21. log.info("mq:xx-create2 received <{}>", message);
  22. // throw new ServiceException("报错模拟");
  23. }
  24. @RabbitListener(queues = Constant.MQ.XX.Queue.update)
  25. public void onUpdate1Message(XXVo message) {
  26. log.info("mq:xx-update1 received <{}>", message);
  27. }
  28. @RabbitListener(queues = Constant.MQ.XX.Queue.update)
  29. public void onUpdate2Message(XXVo message) {
  30. log.info("mq:xx-update2 received <{}>", message);
  31. }
  32. }

发布消息

你可以用自己喜欢的方式发送,我这里用 RestController

  1. package com.xx.controller;
  2. import com.xx.constant.Constant;
  3. import com.xx.vo.xx.XXVo;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import org.springframework.amqp.rabbit.core.RabbitTemplate;
  8. import org.springframework.http.ResponseEntity;
  9. import org.springframework.web.bind.annotation.GetMapping;
  10. @Slf4j
  11. @RestController()
  12. @RequestMapping("mq")
  13. public class MQController {
  14. private final RabbitTemplate rabbitTemplate;
  15. public MQController(RabbitTemplate rabbitTemplate) {
  16. this.rabbitTemplate = rabbitTemplate;
  17. }
  18. @GetMapping("create")
  19. public ResponseEntity<String> create(){
  20. final XXVo message = new XXVo()
  21. .setName("myesn");
  22. rabbitTemplate.convertAndSend(
  23. Constant.MQ.XX.exchange,
  24. Constant.MQ.XX.RoutingKey.create,
  25. message);
  26. // log.info("pub: send create message");
  27. return ResponseEntity.ok("create pub");
  28. }
  29. @GetMapping("update")
  30. public ResponseEntity<String> update(){
  31. final XXVo message = new XXVo()
  32. .setName("myesn");
  33. rabbitTemplate.convertAndSend(
  34. Constant.MQ.XX.exchange,
  35. Constant.MQ.XX.RoutingKey.update,
  36. message);
  37. // log.info("pub: send update message");
  38. return ResponseEntity.ok("update pub");
  39. }

测试

现在可以通过 http://ip:port/mq/createhttp://ip:port/mq/update 来测试消息的发布与消费

总结

示例中只使用了 direct exchange 模式,并且最终是 point to point 的通道类型(channel)。

在消息系统标准协议中,一个队列只能被一个消费者消费,如果想一个消息被多个消费者同时消费(发布消息后,所有消费者都能收到),那么就需要多个 queue 了。

测试总结(归纳文章要点):

  1. 自动创建 exchange、queue、binding,不需要手动在 web 上创建
  2. exchange、queue 持久化,rabbitmq 重启或无客户端时都不会自动删除 exchange、queue
  3. 消费者消费过程中报错,消息不会丢失,会自动切换到其他监听此队列的消费者(如果没有消息就一直被持久化),如果网站做了负载均衡,它也会自动让其他实例消费,如果负载均衡中所有节点中的消费者都报错,它也会一直循环在各个节点中消费消息,消息不会丢失,只有消费者成功消费消息(没有任何抛错),它才会从队列中移除此消息,点赞

文章参考

  1. RabbitMQ中的Exchange Types
  2. RabbitMQ Exchange类型详解
  3. RabbitMQ各个参数含义

我自己也整理了一份 xmind 放在 github,但 repo 目前是 private 的,就不开放了。

spring boot 集成 rabbitmq 指南的更多相关文章

  1. Spring Boot 集成 RabbitMQ 实战

    Spring Boot 集成 RabbitMQ 实战 特别说明: 本文主要参考了程序员 DD 的博客文章<Spring Boot中使用RabbitMQ>,在此向原作者表示感谢. Mac 上 ...

  2. Spring boot集成RabbitMQ(山东数漫江湖)

    RabbitMQ简介 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出 ...

  3. 85. Spring Boot集成RabbitMQ【从零开始学Spring Boot】

    这一节我们介绍下Spring Boot整合RabbitMQ,对于RabbitMQ这里不过多的介绍,大家可以参考网络上的资源进行安装配置,本节重点是告诉大家如何在Spring Boot中使用Rabbit ...

  4. RabbitMQ(3) Spring boot集成RabbitMQ

    springboot集成RabbitMQ非常简单,如果只是简单的使用配置非常少,springboot提供了spring-boot-starter-amqp项目对消息各种支持. 资源代码:练习用的代码. ...

  5. spring boot集成RabbitMQ

    原文:https://www.jianshu.com/p/e1258c004314 RabbitMQ作为AMQP的代表性产品,在项目中大量使用.结合现在主流的spring boot,极大简化了开发过程 ...

  6. Spring Boot 集成RabbitMQ

    在Spring Boot中整合RabbitMQ是非常容易的,通过在Spring Boot应用中整合RabbitMQ,实现一个简单的发送.接收消息的例子. 首先需要启动RabbitMQ服务,并且add一 ...

  7. spring boot 集成 rabbitmq

    1.使用默认的AmqpTemplate生产消费pojo时,pojo需要implement Serializable,否则会抛出org.springframework.amqp.AmqpExceptio ...

  8. spring boot 集成RabbitMQ的异常

    com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.clos ...

  9. Spring boot集成Rabbit MQ使用初体验

    Spring boot集成Rabbit MQ使用初体验 1.rabbit mq基本特性 首先介绍一下rabbitMQ的几个特性 Asynchronous Messaging Supports mult ...

随机推荐

  1. js技术之根据name获取input的值

    一.前端的代码 <p>Name: <input type='text', name = 'name'/></p> <p>Age: <input t ...

  2. Linux下切换python2和python3

    为什么需要有两个版本的Python Python2和Python3不兼容是每个接触过Python的开发者都知道的事,虽说Python3是未来,但是仍然有很多项目采用Python2开发.Linux的许多 ...

  3. jupyter notebook使用技巧

    shift + tab 键可以查看对应源代码(注意:需要先将代码运行才能查看) Jupyter Notebook 的快捷键 Jupyter Notebook 有两种键盘输入模式:1.命令模式,键盘输入 ...

  4. 一个关于小程序与单片机的通信实例(TCP/IP)

    前言 这是一个18年初的创业项目的核心功能要求,我们当时打算做一个共享类的项目,项目的主题是共享图书,线下的形式租借图书,我们当时是考虑做一个借书柜的形式,然后线下生产投放借书柜,这些借书柜本身能存放 ...

  5. DRF 视图组件

    目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...

  6. git的下载安装以及基本操作

    版权声明:本文为CSDN博主「~李疆」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.转载原文链接:https://blog.csdn.net/qq_403232 ...

  7. 使用pyinstaller库打包文件

    1.pyinstaller的安装 先win+r打开cmd,安装具体命令如下: pip3 install pyinstaller  2.使用pyinstaller库打包文件 假设Python源文件LPR ...

  8. 1s 创建100G文件,最快的方法是?

    在我们日常工作中,为了验证开发的功能,比如:文件上传功能或者算法的处理效率等,经常需要一些大文件进行测试,有时在四处找了一顿之后,发现竟然没有一个合适的,虽然 Linux 中也有一些命令比如:vim. ...

  9. Java学习day9

    抽象类的关键字:abstract 类中有抽象方法时,需要在类名前也加上abstract关键字,即 public abstract class 类名{ } 同时,抽象类不能直接实例化,需要通过子类继承, ...

  10. Sentinel基础应用

    Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性. Sentinel ...