SpringBoot 整合RabbitMQ

一、简介

RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层。保存这个数据。

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

首先需要下载到rabbitmq 在这里笔者就不介绍下载安装的过程了,可自寻文章也可参考该篇文章

rabbitmq下载安装:https://blog.csdn.net/lihua5419/article/details/93006834
笔者的安装包:https://pan.baidu.com/s/17G59XbTVzAz63anZUmDK7w
提取码:1234

下载安装后就开始整合吧

二、整合SpringBoot

1.相关依赖

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

2. application.yml 配置

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    #信息确认
    publisher-confirm-type: correlated  #消息有没有到达MQ(会返回一个ack确认码)
    publisher-returns: true #消息有没有找到合适的队列
    listener:
      simple:
        acknowledge-mode: manual #手动确认机制

3.手动信息确认回调函数 (ConfirmCallBackHandler)

public class ConfirmCallBackHandler implements RabbitTemplate.ConfirmCallback {
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        System.out.println("消息唯一标识:"+correlationData);
        System.out.println("确认结果:"+ack);
        System.out.println("失败原因:"+cause);
    }
}

4. 配置rabbitmq队列交换机(FanoutRabbitConfig)

@Configuration
public class FanoutRabbitConfig {
    @Autowired
    RabbitTemplate rabbitTemplate;

    //一个队列
    @Bean
    public Queue queueA() {
        return new Queue("queue");
    }

    //一个扇型交换机
    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanout-Exchange");
    }

    //队列绑定扇形交换机
    @Bean
    Binding bindingExchangeA(Queue queueA, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(queueA).to(fanoutExchange);
    }

    //初始化加载方法,对RabbitTemplate进行配置
    @PostConstruct
    void rabbitTemplate(){
        //消息发送确认,发送到交换器Exchange后触发回调
        rabbitTemplate.setConfirmCallback(new ConfirmCallBackHandler());
    }



}

5. 生产者(Sender)

import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * <p><p/>
 *
 * @Author: porridge
 * @Date:2022/4/2 19:35
 */
@Component
public class Sender {

    @Autowired
    RabbitTemplate rabbitTemplate;

    //生产者
    public void sender(String title, String context) {

        Map<String, String> map = new HashMap<>();
        map.put("title", title);
        map.put("context", context);


        this.rabbitTemplate.convertAndSend(
                //绑定交换机的名字
                "fanout-Exchange",
                //路由  扇形机无效
                "",
                //内容
                map,
                //唯一id
                new CorrelationData(UUID.randomUUID().toString())
        );
        System.out.println("信息发送成功");
        System.out.println("**************************");

    }
}

6. 消费者(Listener)

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

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

/**
 * <p><p/>
 *
 * @Author: porridge
 * @Date:2022/4/2 19:51
 */
@Component
public class Listener {

    //消费者
    @RabbitListener(queues = "queue")
    @RabbitHandler
    public void process(Map<String, String> map, Channel channel, Message message) throws IOException {

        String title = map.get("title");
        String context = map.get("context");

        System.out.println("正在消费的内容为:" + title + "," + context);

        //手动确认信息
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        System.out.println("***********");
        System.out.println("消费者消费完的内容为:" + title + "," + context);
        System.out.println("手动确认消费完毕!");


    }
}

4.测试

@SpringBootTest
class SpringbootRabbitmqApplicationTests {
    @Autowired
    Sender sender;

    @Test
    void Sender() {
        sender.sender("CSDN——porridge","hello word");
    }

}

测试结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值