IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Springboot集成RabbitMq及使用 -> 正文阅读

[Java知识库]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、随之也会带来:系统依赖性、系统问题排查的困难性,如何保证消息的不重复消费,服务器宕机或是网络等问题导致的消息丢失,场景下的消息堆积等等,都是需要进一步解决的

有感

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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 07:54:27  更:2022-05-08 07:58:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:53:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码