美文网首页
SpringBoot中RabbitMQ的使用笔记

SpringBoot中RabbitMQ的使用笔记

作者: 树蜂 | 来源:发表于2018-12-20 10:55 被阅读0次

    本文是本人在SpringBoot中使用RabbitMQ的笔记,若有误还请指正,主要讲参数的设置。
    本文目录
    1、RabbitMQ安装
    2、示例
    3、设置队列长度限制及优先级
    4、设置消息过期
    5、交换机主题的使用
    6、注意事项
    7、报错处理


    1、RabbitMQ安装

    1)安装RabbitMQ前需要先安装erlang
    erlang官网下载 估计要翻墙
    没有翻墙的同学可在此下载 windows 21.1版本(2018.11.29最新版本)
    2)下载RabbitMQ,笔者使用3.7.9
    http://www.rabbitmq.com/download.html
    3)安装略
    4)安装可视化管理工具
    参考官方文档
    操作起来很简单,只需要在DOS下面,进入安装目录

    G:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.9\sbin

    执行如下命令就可以成功安装。

    rabbitmq-plugins enable rabbitmq_management

    可以通过http://localhost:15672访问。
    默认的登陆账号为:guest,密码为:guest。

    2、示例

    参考 此处

    3、设置队列长度限制及优先级

    参考 此处
    类似第4点设置消息过期,设置两种对队列长度的限制方式

    • 对队列中消息的条数进行限制 x-max-length
    • 对队列中消息的总量进行限制 x-max-length-bytes

    4、设置消息过期

    原因:消息队列会存储在硬盘,假若服务器挂了、关机了,没能及时消费消息,则会造成数据挤压。
    目的:假若消息在一定时间内没有处理,则自动删除。
    实现:以下两种方式都是设置1秒后,删除未消费的消息

    方式一、在控制台进行配置

    添加消息队列,并添加 x-message-ttl 参数和设定其过期时间。


    image.png
    方式二、通过配置文件处理
    import org.springframework.amqp.core.*;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    
    @Configuration
    public class QueueConfig {
        public static String ROUTING_KEY = "queue_ttl";
        
        @Bean
        Queue queue() {
            return QueueBuilder.durable(ROUTING_KEY)
    //                           .withArgument("x-dead-letter-exchange", DELAY_EXCHANGE_NAME) // DLX
    //                           .withArgument("x-dead-letter-routing-key", DELAY_PROCESS_QUEUE_NAME) // dead letter携带的routing key
                               .withArgument("x-message-ttl", 1000) // 设置队列的过期时间
                               .build();
        }
    }
    

    测试

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.amqp.core.AmqpTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    
    @SpringBootTest(classes=SendApplication.class)
    @RunWith(SpringJUnit4ClassRunner.class)
    public class NormalSendTester 
    {
        @Autowired
        private AmqpTemplate template;
        private static String ROUTING_KEY = "queue_ttl";
        
        @Test
        public void testRabbit() 
        {
            template.convertAndSend(ROUTING_KEY, "hello");
        }
    }
    
    

    5、交换机主题的使用

    参考
    介绍: RabbitMQ的四种交换机
    代码: springboot整合RabbitMQ

    6、注意事项

    1)后台需要已配置消息队列,才能绑定监听;
    2)前后启动相同消息队列,要保证其配置一致;
    3)如下进行配置,但假若主机中还没有queue_ttl队列,则只有在发送端发送该队列消息或者在监听端绑定监听后,才会在主机中创建该队列。
    因此,如果需要配置队列参数,则发送端跟接收端最好都配置上。

    @Configuration
    public class QueueConfig {
        public static String ROUTING_KEY = "queue_ttl";
        
        @Bean
        Queue queue() {
            return QueueBuilder.durable(ROUTING_KEY)
                               .withArgument("x-message-ttl", 1000) // 设置队列的过期时间
                               .build();
        }
    }
    

    具体出错情况见下面报错处理

    6、报错处理

    1)新建一个消息队列 queue_ttl 后报了如下错误

    org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):[queue_ttl]

    在控制台中添加消息队列即可


    image.png

    2)启动时报如下错误

    ERROR 5624 --- [ 127.0.0.1:5672] o.s.a.r.c.CachingConnectionFactory : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'x-message-ttl' for queue 'jishufeng' in vhost '/': received the value '1000' of type 'signedint' but current is none, class-id=50, method-id=10)

    是现启动的队列配置与后台已有的配置不一致导致的。
    解决:进入后台,删除已有配置即可,删除前要关闭已有连接程序。

    相关文章

      网友评论

          本文标题:SpringBoot中RabbitMQ的使用笔记

          本文链接:https://www.haomeiwen.com/subject/ovsdkqtx.html