首页 > 其他分享 >Springboot中使用RabbitMq

Springboot中使用RabbitMq

时间:2023-10-14 10:34:21浏览次数:48  
标签:Springboot rabbitmq RabbitMq String USER 使用 test public user

代码地址: https://gitee.com/Aes_yt/middleware-demo/tree/master/rabbitmq

安装RabbitMq

1. docker拉取镜像
docker pull rabbitmq:3.9.29-management
2. 创建rabbitmq容器
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9.29-management
3. 访问地址

http://{ip地址}:15672/,可以看到RabbitMq的管理后台界面。账号密码默认 guest

消息生产和消费

rabbitmq-producer
  1. 新建module,引入依赖

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    
  2. yaml配置地址

    spring:
      rabbitmq:
        host: 192.168.67.131
        port: 5672
        username: guest
        password: guest
        virtual-host: /
    
  3. 配置交换机

    @Configuration
    public class RabbitMqConfig {
        /*定义交换机名称*/
        public static final String USER_INFO_EXCHANGE_NAME = "user_info_exchange";
    
        @Bean
        public Exchange userInfoExchange() {
            return ExchangeBuilder.topicExchange(USER_INFO_EXCHANGE_NAME).durable(true).build();
        }
    }
    
  4. 发送消息

        @Test
        public void sendMessage() {
    
            String registerMsg = "user register..." + new Date();
            // 1. 发送一条注册消息
            rabbitTemplate.convertAndSend(RabbitMqConfig.USER_INFO_EXCHANGE_NAME,
                    "user.register.user1", registerMsg, msg -> {
                        msg.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
                        return msg;
                    });
            log.info("消息发送完成:{}", registerMsg);
    
    
            String loginMsg = "user login..." + new Date();
            // 2. 发送一条登录消息
            rabbitTemplate.convertAndSend(RabbitMqConfig.USER_INFO_EXCHANGE_NAME,
                    "user.login.user1", loginMsg, msg -> {
                        msg.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
                        return msg;
                    });
            log.info("消息发送完成:{}", loginMsg);
    
        }
    
rabbitmq-consumer
  1. 新建module,引入依赖

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    
  2. yaml配置地址

    spring:
      rabbitmq:
        host: 192.168.67.131
        port: 5672
        username: guest
        password: guest
        virtual-host: /
    
  3. 配置队列绑定关系

    @Configuration
    public class RabbitMqConfig {
        @Value("${spring.rabbitmq.host}")
        private String host;
        @Value("${spring.rabbitmq.port}")
        private Integer port;
        @Value("${spring.rabbitmq.username}")
        private String username;
        @Value("${spring.rabbitmq.password}")
        private String password;
    
        /*定义交换机名称*/
        public static final String USER_INFO_EXCHANGE_NAME = "user_info_exchange";
        /*定义队列名称*/
        public static final String USER_REGISTER_QUEUE_NAME = "user_register_queue";
        public static final String USER_LOGIN_QUEUE_NAME = "user_login_queue";
    
        public static final String USER_REGISTER_ROUTING_KEY = "user.register.#";
        public static final String USER_LOGIN_ROUTING_KEY = "user.login.#";
    
        @Bean
        public Exchange userInfoExchange() {
            return ExchangeBuilder.topicExchange(USER_INFO_EXCHANGE_NAME).durable(true).build();
        }
    
        @Bean
        public Queue userRegisterQueue() {
            return QueueBuilder.durable(USER_REGISTER_QUEUE_NAME).build();
        }
    
        @Bean
        public Queue userLoginQueue() {
            return QueueBuilder.durable(USER_LOGIN_QUEUE_NAME).build();
        }
    
        @Bean
        public Binding userRegisterBinding() {
            return BindingBuilder.bind(userRegisterQueue()).to(userInfoExchange()).with(USER_REGISTER_ROUTING_KEY).noargs();
        }
    
        @Bean
        public Binding userLoginBinding() {
            return BindingBuilder.bind(userLoginQueue()).to(userInfoExchange()).with(USER_LOGIN_ROUTING_KEY).noargs();
        }
    
    }
    
  4. 监听器

    @Component
    @Slf4j
    public class UserInfoListener {
    
        @RabbitListener(queues = RabbitMqConfig.USER_REGISTER_QUEUE_NAME)
        public void userRegister(String msg){
            log.info(msg);
        }
    
        @RabbitListener(queues = RabbitMqConfig.USER_LOGIN_QUEUE_NAME)
        public void userLogin(String msg){
            log.info(msg);
        }
    }
    
  5. 结果

    启动producer项目和consumer项目,producer发送消息,consumer接收到消息:

    producer:

    2023-07-08 10:26:10.660  INFO 7432 --- [main] com.yt.rabbit.RabbitProducerTest: 消息发送完成:user register...Sat Jul 08 10:26:10 CST 2023
    2023-07-08 10:26:10.663  INFO 7432 --- [main] com.yt.rabbit.RabbitProducerTest: 消息发送完成:user login...Sat Jul 08 10:26:10 CST 2023
    

    consumer:

    2023-07-08 10:26:10.661  INFO 25108 --- [ntContainer#1-1] c.yt.rabbitmq.listener.UserInfoListener  : user register...Sat Jul 08 10:26:10 CST 2023
    2023-07-08 10:26:10.665  INFO 25108 --- [ntContainer#0-1] c.yt.rabbitmq.listener.UserInfoListener  : user login...Sat Jul 08 10:26:10 CST 2023
    

交换器类型

交换器类型有四种,fanout,topic,direct,headers。
接下来在代码中创建三种交换器类型,对应的routingKey和queue绑定如表格所示。发送对应消息,看看是否能接收到 [Y/N]。headers类型不演示。

Exchange ExchangeType RoutingKey MessageKey Queue Receive
fanout_exchange fanout fanout.test.key1
fanout.#
xxx.yyy.zzz fanout_test_queue1
fanout_test_queue2
Y
Y
topic_exchange topic topic.test.#
topic.#
topic.*
topic.test.key1
topic_test_queue1
topic_test_queue2
topic_test_queue3
Y
Y
N
direct_exchange direct direct.test.key1
direct.test.#
direct.test.key3
direct.test.key1
direct.test.key2
direct.test.key3
direct_test_queue1
direct_test_queue2
direct_test_queue3 && direct_test_queue4
Y
N
Y && Y

direct 的Routingkey是全匹配,通配符不起作用,所以direct_test_queue2没有接收到消息。
topic 的通配符,*正好匹配一个词,#可以匹配一个或多个词,所以topic_test_queue3没有接收到消息。

标签:Springboot,rabbitmq,RabbitMq,String,USER,使用,test,public,user
From: https://www.cnblogs.com/Aeons/p/17763765.html

相关文章

  • ping 工具使用
    ping工具使用Ping(PacketInternetGroper)是其中最常用和最基本的之一。它是一个用于测试网络连接的命令行工具,可以帮助确定计算机是否能够与另一个计算机或网络设备进行通信。1Ping命令的基本用法Ping命令是一个网络工具,用于测试两台计算机之间的网络连接。它通过向目标计算......
  • 使用Stream流将List转化为Map的几种方式
    在工作中常常会遇到将List转化为Map的场景,下面总结了经常使用到的几种方式;并简单的做了简单测试,供大家学习使用。准备工作:List<UserEntity>entityList=newArrayList<>();UserEntityuserEntity=newUserEntity();userEntity.setUserId("0001");userEntity.setUserName("00......
  • Ubuntu下安装使用Powershell
    微软推出新的管理命令行工具WindowsPowershell,它是基于.net的工具,所有的管理对象都是按照.net对象来进行管理的,对使用过.net的开发人员来说就更方便了。从Powershell6.0开始,微软就将其重命名为powershell了,体现了其跨平台性,其实微软推出Powershell的时候就是把其定位为一款跨平台......
  • 基于Win 自带的.NET FrameWork平台,使用文本文件编写C#代码,命令行编译以及引用第三方库
    转载自https://www.infoq.cn/article/2015/12/visual-studio-windows 不用VisualStudio也能开发.NETWindows应用邵思华2015-12-29本文字数:2915字阅读完需:约10分钟对于.NET应用的开发人员而言,以VisualStudio(简称VS)作为首选的开发工具应当是一种最......
  • 使用Hot Chocolate和.NET 6构建GraphQL应用 —— 创建Attribute中间件
    需求在部分接口添加一个机器人校验的功能思路读者们可以看下使用HotChocolate和.NET6构建GraphQL应用(5)——实现Query过滤功能,我们可以自定义创建一个类似的特性中间件来对接口进行管理.添加了该特性的接口即可实现机器人校验功能.实现输入对象///用户输入public......
  • ecs的使用
    前言:最近在学习esc服务器的使用以及网站的建立,特此记录1.1ECS服务器的组成ECS服务器由实例(vcpu内存)块存储(磁盘)网络等物理组件和镜像快照安全组等功能组件组成1.2LAMP环境的部署搭建网站需要LAMP或者LNMP环境,这里简单介绍LAMP环境的建立,由于启动ecs服务器时已经......
  • 在Python中使用LSTM和PyTorch进行时间序列预测|附代码数据
    全文链接:http://tecdat.cn/?p=8145最近我们被客户要求撰写关于LSTM的研究报告,包括一些图形和统计输出。顾名思义,时间序列数据是一种随时间变化的数据类型。例如,24小时内的温度,一个月内各种产品的价格,一年中特定公司的股票价格诸如长期短期记忆网络(LSTM)之类的高级深度学习模型能......
  • 使用Python解决面试题:计算青蛙跳上n个台阶的跳法总数
    面试题要求我们计算一个青蛙跳上具有n个台阶的跳法总数,其中青蛙每次可以跳上一个台阶或两个台阶。这是一个经典的递归问题,我们可以使用Python编写一个递归函数来实现。解决方案:我们可以使用递归函数来计算青蛙跳上n个台阶的跳法总数。我们可以考虑最后一步青蛙跳了多少个台阶,以此将......
  • postman如何使用md5 、base64加密传参
    使用CryptoJS库什么是CryptoJS?CryptoJS是一个纯JavaScript实现的加密库,提供了很多常见的加密算法和加密模式,例如AES、DES、TripleDES、MD5、SHA-1、SHA-256等。它支持的加密方式很全面,使用简便,而且在前端中使用也非常方便postman在Pre-requestScript中先进行加密,然后设置全局......
  • 使用python将txt文件中的ip地址转换成当地城市名称
    具体代码importreimportrequestsimportconcurrent.futures#用于匹配IPv4地址的正则表达式ipv4_pattern=re.compile(r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b')#用于发送API请求并获取城市信息的函数defget_city_info(ip):response=requests.get(f'http://ip-......