Springboot集成RabbitMq及使用


前言

提示:本文介绍Springboot集成RabbitMq,以及简单的使用

欢迎关注个人公众号领取学习资料

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、简单介绍MQ

消息中间件作用:异步操作、系统解耦、流量削峰等,具体使用可根据实际业务场景
常用MQ:Rabbitmq、RocketMQ、Kafka(本文将介绍兔子的使用)

二、安装

1.安装Docker(安装步骤省略,网上很多)

2.Docker安装Rabbitmq

命令如下(示例):

//拉取镜像
docker pull rabbitmq:3.8.0-management

//运行镜像   5672:服务端口   15672:web界面控制端口
docker run -d -p 5672:5672 -p 15672:15672 --name rabbmitq ID
 
// 进入容器
docker exec -it MQ容器ID bash

//创建用户、设置密码、赋予权限()
rabbitmqctl list_users  # 查看全部用户
rabbitmqctl add_user ceshi aaa123   #创建用户、设置密码
rabbitmqctl set_permissions -p / ceshi ".*" ".*" ".*"   #权限
rabbitmqctl set_user_tags ceshi administrator   #管理员

//退出容器
exit

3.查看是否启动成功http://ip:15672

三、Springboot代码配置

1.yml配置

  rabbitmq:
    host: 服务器ip
    port: 5672
    username: ceshi
    password: aaa123
    #虚拟host 可以不设置,使用server默认host
    virtual-host:

2.pom.xml依赖配置

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

3.消息队列枚举

import lombok.Getter;
/**
 * @Author: 高彬彬
 * @Date: 2022/3/22
 * @Description: 消息队列枚举
 * @Version: 1.0
 */
@Getter
public enum QueueEnum {

    /**
     * Demo队列
     */
    QUEUE_DEMO("direct-demo", "queue-demo", "key-demo");
    
    /**
     * 交换名称
     */
    private String exchange;

    /**
     * 队列名称
     */
    private String name;

    /**
     * 路由键
     */
    private String routeKey;

    QueueEnum(String exchange, String name, String routeKey) {
        this.exchange = exchange;
        this.name = name;
        this.routeKey = routeKey;
    }
}

4.消息队列相关配置

import com.jack.modules.wms.common.enums.QueueEnum;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author: 高彬彬
 * @Date: 2022/3/22
 * @Description: 消息队列相关配置
 * @Version: 1.0
 */
@Configuration
public class RabbitMqConfig {

    /**
     * DEMO队列
     */
    @Bean
    public Queue demoQueue() {
        return new Queue(QueueEnum.QUEUE_DEMO.getName(), true);
    }

    /**
     * DEMO交换机
     */
    @Bean
    DirectExchange demoExchange() {
        return new DirectExchange(QueueEnum.QUEUE_DEMO.getExchange());
    }

    /**
     * 将DEMO队列与DEMO交换机绑定,设置匹配routeKey
     */
    @Bean
    Binding demoBinding() {
        return BindingBuilder.bind(demoQueue()).to(demoExchange()).with(QueueEnum.QUEUE_DEMO.getRouteKey());
    }
    
}

四、生产者代码示例

@Autowired
RabbitTemplate rabbitTemplate;

//在对应的业务中调用
rabbitTemplate.convertAndSend(QueueEnum.QUEUE_DEMO.getExchange(), QueueEnum.QUEUE_DEMO.getRouteKey(), "生产者数据DEMO");

五、消费者代码示例

import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @Author: 高彬彬
 * @Date: 2022/3/22
 * @Description: Demo消费者
 * @Version: 1.0
 */
@Component
@RabbitListener(queues = "queue-demo")
public class DemoReceiver {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @RabbitHandler
    public void process(String msg, @Header(AmqpHeaders.DELIVERY_TAG) long tag, Channel channel) throws IOException {
        logger.info("从MQ队列拿到的消息" + msg);
        // 确认消息, false表示不会重新放回队列
        channel.basicAck(tag, false);
    }
}

控制台可查看到从队列拿到的消息,也可以在web管理界面查看消息的消息情况


总结

1、队列的使用可以在一些场景下提升系统的吞吐量,优化用户体验,提升系统的瓶颈等等
2、随之也会带来:系统依赖性、系统问题排查的困难性,如何保证消息的不重复消费,服务器宕机或是网络等问题导致的消息丢失,场景下的消息堆积等等,都是需要进一步解决的

有感

编程之路漫长而道远
正如学如逆水行舟不进则退
编程不仅是一份工作更是属于自己的爱好
知识的积累需要时间来推动

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值