消息队列-RabbitMQ

本文详细介绍了消息队列RabbitMQ的基本概念、安装步骤,以及如何在SpringBoot项目中集成和使用。通过创建交换机、队列和绑定,实现了消息的发送与消费,展示了异步处理、解耦合和削峰填谷等特性。同时,提供了发送不同消息类型的消费方法,通过日志输出验证了消息的正确接收与处理。
摘要由CSDN通过智能技术生成

什么是消息队列

消息队列在当今的Java生态中是一个十分重要的一环,是一种中间件,用于解决Java系统中复杂的一环。
在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据。这也充分体现了和后台线程是一样的,只关注于过程,不关注结果。
消息队列的特点(面试必问):

  • 异步
  • 解耦
  • 削峰填谷

安装

安装Erlang,并配置环境变量

  • 下载
    首先进入官网下载相应的安装包。
    因为我是基于本地测试用的,所以下载的windows版本,如果基于开发场景用的话,建议在Linux系统中直接用Docker镜像拉取相应的包即可。
    在这里插入图片描述
    下载完傻瓜式安装即可。
  • 配置环境变量
    打开环境变量,在“path”中配置刚才安装的位置。在这里插入图片描述
  • 测试
    输入 erl -version
    在这里插入图片描述

下载rabbitMQ

  • 下载
    进入官网,下载相应的版本。
    在这里插入图片描述
    一样的,傻瓜式安装就行了。

  • 安装管理器
    进入刚才安装的目录,进入/sbin,在这个目录下打开cmd
    执行rabbitmq-plugins enable rabbitmq_management
    在这里插入图片描述

  • 查看服务启动
    在这里插入图片描述
    以上全部配置成功就代表万完成了安装。
    进入http://localhost:15672
    账号密码:guest/guest

集成SpringBoot

配置依赖

  • pom文件
  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
   </dependency>
  • 启动类
@EnableRabbit  
  • application.yml
rabbitmq:
    host: 127.0.0.1
    port: 5672
    virtual-host: /

代码实现

创建交换机、队列及其绑定

@Test
    public void creteExchange() {
        DirectExchange directExchange = new DirectExchange("hello-change", true, false);
        amqpAdmin.declareExchange(directExchange);
        log.info("exchange【{}】创建成功!", "hello-change");
    }


    @Test
    public void createQueue() {
        Queue queue = new Queue("hello-queue", true, false, false);
        amqpAdmin.declareQueue(queue);
        log.info("Queue【{}】创建成功!", "hello-queue");
    }


    @Test
    public void createBinding() {
        Binding binding = new Binding("hello-queue",
                Binding.DestinationType.QUEUE,
                "hello-change",
                "hello",
                null);
        amqpAdmin.declareBinding(binding);
        log.info("Binding【{}】创建成功!", "hello-binding");
    }

进入以下页面就代表绑定成功了。
在这里插入图片描述

发送消息

package com.tomalen.gulimall.order.controller;

import com.tomalen.gulimall.order.entity.OrderEntity;
import com.tomalen.gulimall.order.entity.OrderReturnReasonEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;

@RestController
@Slf4j
public class RabbitController {

    @Autowired
    RabbitTemplate rabbitTemplate;
    
    @GetMapping("/sendMessage")
    public String sendMessage(@RequestParam(value = "num", defaultValue = "10") Integer num) {
        for (int i = 0; i < num; i++) {
            if (i % 2 == 0) {
                OrderReturnReasonEntity reasonEntity = new OrderReturnReasonEntity();
                reasonEntity.setId(1L);
                reasonEntity.setName("不符合");
                reasonEntity.setCreateTime(new Date());
                rabbitTemplate.convertAndSend("hello-change", "hello", reasonEntity);
                log.info("发送消息【{}】成功!", reasonEntity);
            } else {
                //发送不同类型的消息
                OrderEntity orderEntity = new OrderEntity();
                orderEntity.setId(1L);
                orderEntity.setBillContent("cTest");
                rabbitTemplate.convertAndSend("hello-change", "hello", orderEntity);
                log.info("发送消息【{}】成功!", orderEntity);
            }
        }
        return "ok";
    }


}

消费消息

因为发送了不同类型的消息,所以要有方法重载为细粒度消费。

@RabbitListener(queues = "hello-queue")
@Slf4j
@Service("orderItemService")
public class OrderItemServiceImpl extends ServiceImpl<OrderItemDao, OrderItemEntity> implements OrderItemService {
    
    /**
     * queue:声明要监听的队列
     * Message: 原生消息:头+体
     * OrderReturnReasonEntity:<T> 发送的消息类型
     *
     *  Channel:当前传输数据的通道
     *
     *  Queues: 很多人可以进行监听,只要收到消息,就删除消息,而且只能有一个收到此消息
     *  @RabbitListener:用于类+方法上,(监听哪些队列)
     *  @RabbitHandler:标在方法上(重载类型不同的消息)
     *
     */
    @RabbitHandler
    public void listenMessage(Message message,
                              OrderReturnReasonEntity content,
                              Channel channel) {
        //封装的是发送消息的信息
        byte[] body = message.getBody();
        log.info("接收到消息,内容:{}", content);
    }


    @RabbitHandler
    public void listenMessage2(Message message,
                              OrderEntity content,
                              Channel channel) {
        //封装的是发送消息的信息
        byte[] body = message.getBody();
        log.info("接收到消息,内容:{}", content);
    }
}

测试

控制台输出,可以看出发送的消息都被消费了。

2022-04-30 14:13:27.042  INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController  : 发送消息【OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)】成功!
2022-04-30 14:13:27.042  INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController  : 发送消息【OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)】成功!
2022-04-30 14:13:27.042  INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController  : 发送消息【OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)】成功!
2022-04-30 14:13:27.043  INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController  : 发送消息【OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)】成功!
2022-04-30 14:13:27.043  INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController  : 发送消息【OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)】成功!
2022-04-30 14:13:27.044  INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController  : 发送消息【OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)】成功!
2022-04-30 14:13:27.044  INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl      : 接收到消息,内容:OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)
2022-04-30 14:13:27.044  INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController  : 发送消息【OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)】成功!
2022-04-30 14:13:27.044  INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController  : 发送消息【OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)】成功!
2022-04-30 14:13:27.044  INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl      : 接收到消息,内容:OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)
2022-04-30 14:13:27.044  INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController  : 发送消息【OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)】成功!
2022-04-30 14:13:27.044  INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl      : 接收到消息,内容:OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)
2022-04-30 14:13:27.044  INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController  : 发送消息【OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)】成功!
2022-04-30 14:13:27.045  INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl      : 接收到消息,内容:OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)
2022-04-30 14:13:27.045  INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl      : 接收到消息,内容:OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)
2022-04-30 14:13:27.045  INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl      : 接收到消息,内容:OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)
2022-04-30 14:13:27.046  INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl      : 接收到消息,内容:OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)
2022-04-30 14:13:27.046  INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl      : 接收到消息,内容:OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)
2022-04-30 14:13:27.047  INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl      : 接收到消息,内容:OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)
2022-04-30 14:13:27.047  INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl      : 接收到消息,内容:OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个在努力为老板实现梦想的搬砖工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值