SpringBoot整合RabbitMQ消息中间件

说在前头: 本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。

SpringBoot整合RabbitMQ消息中间件_第1张图片

RabbitMQ简介

RabbitMQ是开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ使用Erlang语言编写,并且RabbitMQ是基于AMQP协议的(下图是RabbitMQ与Erlang版本对照表:注意,版本不对应会导致RabbitMQ部署失败,本人在这踩了挺久的坑,希望大家可以避免)

RabbitMQ版本范围 Erlang版本范围
3.7.7 - 3.7.12 20.3.x-21.x
3.7.0 - 3.7.6 19.3 -20.3.x

AMQP协议简介

AMQP全称:Advanced Message Queuing Protocol(高级消息队列协议),一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

处理流程: 生产者是消息发送到Exchange,Exchange根据路由规则Routing Key将消息路由到不同的Queue上,如果Queue上有消费者监听,则消费者可以获得消息。生产者在生产消息的时候是不知道消费者的状态的,消费者在消费消息时也是不知道消息是从哪个生产者来的,即生产者与消费者之间的完全解耦的。(下图为AMQP模型图)
SpringBoot整合RabbitMQ消息中间件_第2张图片
接下来,我们将正式开始对RbaiitMQ与SpringBoot进行整合,快上车,快上车!!要开车啦!!要开车啦!!


SpringBoot整合RabbitMQ消息中间件_第3张图片

一、依赖配置

pom.xml(主要引入spring-boot-starter-amqp依赖)

<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-webartifactId>
	<version>2.5.2version>
dependency>

<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-amqpartifactId>
	<version>2.4.5version>
 dependency>

二、配置文件

application.yml (其中:acknowledge-mode设置为手动消费manual,也可设置为自动消费auto)

server:
  port: 80

spring:
  rabbitmq:
    addresses: 127.0.0.1:5672
    username: guest
    password: guest
    virtual-host: /
    connection-timeout: 15000
    listener:
      simple:
        concurrency: 5
        max-concurrency: 10
        acknowledge-mode: manual

三、发送消息

TestController.class

package com.bosen.www.controller;

import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

/**
 * 

用于测试的控制器类

* @author Bosen * @date 2021/8/12 13:46 */
@RestController public class TestController { @Autowired RabbitTemplate rabbitTemplate; /** *

生产者发送消息

*/
@RequestMapping("/test") public void test(String name) { // 将名字name存入rabbit中 rabbitTemplate.convertAndSend( // 需要发送至的交换机名称 "test-exchange", // 需要发送至的路由关键字 "test.keyword", // 消息体,即发送的消息 name, // 消息唯一ID new CorrelationData(UUID.randomUUID().toString()) ); System.out.println("消息信息name=" + name + "已成功发送!"); System.out.println("********************************"); } }

四、消费消息

TestListener.class

package com.bosen.www.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Map;

/**
 * 

用于测试的消息消费者类

* @author Bosen * @date 2021/8/12 13:46 */
@Component public class TestListener { /** *

ss

* @param headers 消息头内容 * @param name 消息体内容,即发送者发送的消息对象 * @param channel 消息通道,手动签收需要依赖它 */
@RabbitListener( bindings = @QueueBinding( // 绑定交换机 exchange = @Exchange(name = "test-exchange"), // 绑定队列 value = @Queue(value = "test-queue"), // 绑定路由 key = "test.keyword" ) ) @RabbitHandler public void action(@Headers Map<String, Object> headers, @Payload String name, Channel channel) throws IOException { System.out.println("消费者正在消费name=" + name); // 手动确认消费 channel.basicAck((Long) headers.get(AmqpHeaders.DELIVERY_TAG), false); System.out.println("消费者手动确认消费完毕!"); } }

五、测试环节

将上述的代码编写完毕后,我们就可以正式开始进入测试环节。访问消息发送者的请求地址:http://localhost/test?name=Bosen,并带上参数name=Bosen,此时查看程序运行的控制台输出如下:
SpringBoot整合RabbitMQ消息中间件_第4张图片
到此,SpringBoot与RabbitMQ已成功整合!!

SpringBoot整合RabbitMQ消息中间件_第5张图片

你可能感兴趣的:(SpringBoot,rabbitmq,中间件,队列,java,交换机)