SpringBoot集成和使用消息队列

简介: SpringBoot集成和使用消息队列

前言

SpringBoot 中使用消息队列无非就是集成消息队列的客户端,这里主要有有两种方式,一种是使用消息队列提供的原生API,但是需要手动经历创建连接工厂、创建连接、创建信道,以及配置主机、配置端口等等一系列比较繁琐的过程,使用起来非常麻烦。

这里更推荐的一种方式是使用 SpringAMQP,SpringAMQP 是对 java 原生客户端进行了一层封装,使用成本大大降低了。其中,AMQP 是一种高级消息队列协议,用于在应用程序之间传递业务消息的开放标准,在 Spring 中它的底层默认实现使用的是 RabbitMQ。

下面我们就学习一下如何集成使用 SpringAMQP,关于消息队列的基础知识和核心概念可以参考:RabbitMQ 消息队列

一、添加 SpringAMQP 依赖

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

二、添加配置信息

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    virtual-host: yourHostName
    username: yourName
    password: yourPassword

三、声明队列、交换机、绑定

1、使用类声明

SpringAMQP 中提供了 Queue、Exchange、Binding 这样几个类用于我们声明队列、交换机、绑定。

@Configuration
public class DirectConfig {
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("simple.direct1");
    }

    @Bean
    public Queue directQueue() {
        return new Queue("simple.queue1");
    }
  
  // 绑定队列simple.queue1和交换机simple.direct1
    @Bean
    public Binding errorBinding(Queue directQueue,DirectExchange directExchange) {
        return BindingBuilder.bind(directQueue).to(directExchange).with("testKey");
    }
  // 相同的方式,声明第二个队列、交换机、绑定。略……
}

2、使用注解声明

@Component
public class MqListener {
    // Direct交换机示例
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "simple.queue1"),
            exchange = @Exchange(name = "simple.direct1",type = ExchangeTypes.DIRECT),
            key = {"testKey1","testKey2"}
    ))
    public void listenDirectQueue1(String msg) {
        System.out.println("消费者:收到的消息:"+ msg);
    }
  // 相同的方式,声明第二个队列、交换机、绑定。略……
}

这里更推荐使用注解的方式,因为使用注解更简单、更灵活。就以一个对列绑定队列时指定多个key为例,使用类的方式需要重复写两次Binding类,使用注解只需要在key属性后添加即可。

四、实现消息的基本收发

1、发送消息

@Component
public class TestSendMsg {
  @Autowired
    private RabbitTemplate rabbitTemplate;

    public void testSendMessageToQueue() {
        String exchangeName = "simple.direct1";
    String routingKey = "testKey";
        // 发消息到指定队列
        Map<String,Object> msg = new HashMap<>();
        msg.put("name","jack");
        msg.put("age",22);
        rabbitTemplate.convertAndSend(exchangeName,routingKey,msg);
    }
}

发送消息需要借助 SpringAMQP 提供的 RabbitTemplate 工具类,因此需要注入 RabbitTemplate 对象.

发送消息调用 RabbitTemplate 对象的 convertAndSend() 方法。发送消息需要指定交换机名、routingKey、消息本体。(PS:如果是Fanout交换机,routingKey参数可以为null或空字符串

“”)

.这里需要注意如果,我们传入的是一个非字符串或非字节类型的对象时,默认Spring对消息的处理是由MessageConverter处理的,而默认实现是SimpleMessageConverter,基于JDK的OBjectOutputStream完成序列化,所以此时我们在RabbitMQ的管理页面看到的消息时序列化的结果,可读性较差。如果想要获取到可读性更强的消息,可以采用JSON序列化替代JDK序列化:

引入JSON依赖

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
</dependency>

修改转换规则

@Configuration
public class Config {
  @Bean
  public MessageConverter messageConverter() {
     return new Jackson2JsonMessageConverter();
  }
}

2、接收消息

@Component
public class MqListener {
    // Direct交换机示例
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "simple.queue1"),
            exchange = @Exchange(name = "simple.direct1",type = ExchangeTypes.DIRECT),
            key = {"testKey1","testKey2"}
    ))
    public void listenDirectQueue1(String msg) {
        System.out.println("消费者:收到的消息:"+ msg);
        // 处理逻辑……
    }
}
  1. 这里使用 SpringAMQP 提供的声明式的消息监听,通过注解在方法上声明要监听的对列名称,将来SpringAMQP就会把接收到的消息传递给当前方法,同时也可以用于队列、交换机、绑定的声明。
  2. 这里的消息接收类型取决于你发送时指定的消息类型。


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
29天前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
96 1
|
1月前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
38 1
|
29天前
|
XML 存储 Java
SpringBoot集成Flowable:构建强大的工作流引擎
在企业级应用开发中,工作流管理是核心功能之一。Flowable是一个开源的工作流引擎,它提供了BPMN 2.0规范的实现,并且与SpringBoot框架完美集成。本文将探讨如何使用SpringBoot和Flowable构建一个强大的工作流引擎,并分享一些实践技巧。
75 0
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
143 1
|
2月前
|
存储 前端开发 Java
Spring Boot 集成 MinIO 与 KKFile 实现文件预览功能
本文详细介绍如何在Spring Boot项目中集成MinIO对象存储系统与KKFileView文件预览工具,实现文件上传及在线预览功能。首先搭建MinIO服务器,并在Spring Boot中配置MinIO SDK进行文件管理;接着通过KKFileView提供文件预览服务,最终实现文档管理系统的高效文件处理能力。
355 11
|
3月前
|
XML Java 关系型数据库
springboot 集成 mybatis-plus 代码生成器
本文介绍了如何在Spring Boot项目中集成MyBatis-Plus代码生成器,包括导入相关依赖坐标、配置快速代码生成器以及自定义代码生成器模板的步骤和代码示例,旨在提高开发效率,快速生成Entity、Mapper、Mapper XML、Service、Controller等代码。
springboot 集成 mybatis-plus 代码生成器
|
3月前
|
Java Spring
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
本文介绍了如何在Spring Boot项目中集成Swagger 2.x和3.0版本,并提供了解决Swagger在Spring Boot中启动失败问题“Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerEx”的方法,包括配置yml文件和Spring Boot版本的降级。
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
|
2月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
113 0
|
4月前
|
NoSQL 关系型数据库 MySQL
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
159 2