本文是本人在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)
是现启动的队列配置与后台已有的配置不一致导致的。
解决:进入后台,删除已有配置即可,删除前要关闭已有连接程序。
网友评论