功能
- 流量消峰
- 应用解耦
- 异步处理
启动
需要erlang:25.3环境
启动rabbitmq
ui
依赖
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!--rabbitmq 依赖客户端-->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.8.0</version>
</dependency>
<!--操作文件流的一个依赖-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
原理
消息应答
为了保证消息在发送过程中不丢失,rabbitmq 引入消息应答机制,消息应答就是:消费者在接收 到消息并且处理该消息之后,告诉 rabbitmq 它已经处理了,rabbitmq 可以把该消息删除了。
如果消费者在没有发送ack的情况下死亡(其通道关闭、连接关闭或TCP连接丢失), RabbitMQ将理解消息没有被完全处理,并将它重新排队。如果同时有其他消费者在线,它会迅速将它重新交付给另一个消费者。这样,您可以确保没有消息丢失,即使工作人员偶尔会死亡。
消费者交付确认强制超时(默认为30分钟)。这有助于发现从不承认交货的有问题的(卡住的)消费者。可以再配置文件修改。
自动应答
消息发送后立即被认为已经传送成功
boolean autoAck = false;
channel.basicConsume(TASK_QUEUE_NAME, autoAck, deliverCallback, consumerTag -> { });
手动应答
- Channel.basicAck(用于肯定确认) RabbitMQ 已知道该消息并且成功的处理消息,可以将其丢弃了。basicAck方法的参数是 deliveryTag和multiple。 - deliveryTag:表示此次确认消息的标识符,用来标识消费者接收到的消息的编号。 - multiple:表示是否批量确认,如果设置为true,则表示确认所有小于等于deliveryTag的消息,如果设置为false,则仅确认当前消息。
- Channel.basicNack(用于否定确认) 消息重回队列
- Channel.basicReject(用于否定确认) 与 Channel.basicNack 相比少一个参数 不处理该消息了直接拒绝,可以将其丢弃了
MQ的basicRecover、basicCancel和basicGet是AMQP中的三个方法,分别用于重新投递未确认消息、取消一个消费者和获取消息。
- basicRecover方法的参数为requeue,表示是否将消息重新加入队列。如果requeue为true,则消息将重新加入队列,等待下一个消费者处理;如果requeue为false,则消息将被放弃。
- basicCancel方法的参数为consumer tag,表示要取消的消费者的标识符。当一个消费者不再需要接收消息时,可以使用basicCancel方法将其从队列中删除。
- basicGet方法的参数为queue、noAck和consumerTag,分别表示要获取消息的队列、是否自动确认消息和消费者的标识符。如果noAck为true,则表示接收到消息后自动确认,否则需要手动确认。如果consumerTag没有指定,则会创建一个新的消费者标识符。