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版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
9月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
483 0
|
9月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
356 0
|
6月前
|
前端开发
SpringBoot2.3.1集成Knife4j接口文档
SpringBoot2.3.1集成Knife4j接口文档
599 44
|
5月前
|
JSON 分布式计算 大数据
springboot项目集成大数据第三方dolphinscheduler调度器
springboot项目集成大数据第三方dolphinscheduler调度器
289 3
|
5月前
|
缓存 JSON 前端开发
第07课:Spring Boot集成Thymeleaf模板引擎
第07课:Spring Boot集成Thymeleaf模板引擎
552 0
第07课:Spring Boot集成Thymeleaf模板引擎
|
5月前
|
Java 关系型数据库 MySQL
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
612 2
|
5月前
|
分布式计算 Java 大数据
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
330 2
|
分布式计算 大数据 Java
springboot项目集成大数据第三方dolphinscheduler调度器 执行/停止任务
springboot项目集成大数据第三方dolphinscheduler调度器 执行/停止任务
106 0
|
5月前
|
存储 人工智能 Java
Springboot集成AI Springboot3 集成阿里云百炼大模型CosyVoice2 实现Ai克隆语音(未持久化存储)
本项目基于Spring Boot 3.5.3与Java 17,集成阿里云百炼大模型CosyVoice2实现音色克隆与语音合成。内容涵盖项目搭建、音色创建、音频合成、音色管理等功能,适用于希望快速掌握Spring Boot集成语音AI技术的开发者。需提前注册阿里云并获取API Key。

热门文章

最新文章