8、RabbitMQ-消息的确认机制(生产者)
RabbitMQ 之消息确认机制(事务+Confirm)
https://blog.csdn.net/u013256816/article/details/55515234
概述:
生产者:
- import java.io.IOException;
- import java.util.concurrent.TimeoutException;
- import com.rabbitmq.client.Channel;
- import com.rabbitmq.client.Connection;
- import com.rabbitmq.util.ConnectionUtils;
- public class TXsend {
- private static final String QUEUE_NAMW = "test_tx_queue";
- public static void main(String[] args) throws IOException, TimeoutException {
- Connection conn = ConnectionUtils.getConnection();
- Channel channel = conn.createChannel();
- channel.queueDeclare(QUEUE_NAMW, false, false, false, null);
- String msg = "tx";
- try {
- //开启事务模式、
- channel.txSelect();
- channel.basicPublish("", QUEUE_NAMW, null, msg.getBytes());
- //模拟事故
- int i = /;
- //提交
- channel.txCommit();
- } catch (Exception e) {
//进行事务回滚- channel.txRollback();
- System.out.println("TxRollback...");
- }
- channel.close();
- conn.close();
- }
- }
消费者:
- import java.io.IOException;
- import java.util.concurrent.TimeoutException;
- import com.rabbitmq.client.Channel;
- import com.rabbitmq.client.Connection;
- import com.rabbitmq.client.Consumer;
- import com.rabbitmq.client.DefaultConsumer;
- import com.rabbitmq.client.Envelope;
- import com.rabbitmq.client.AMQP.BasicProperties;
- import com.rabbitmq.util.ConnectionUtils;
- public class TxReceive {
- private static final String QUEUE_NAMW = "test_tx_queue";
- public static void main(String[] args) throws IOException, TimeoutException {
- Connection conn = ConnectionUtils.getConnection();
- Channel channel = conn.createChannel();
- //队列声明
- channel.queueDeclare(QUEUE_NAMW, false, false, false, null);
- channel.basicQos();
- //绑定队列到交换机转发器
- //channel.queueBind(QUEUE_NAMW, "", "");
- //定义一个消费者
- Consumer consumer = new DefaultConsumer(channel){
- //收到消息就会触发这个方法
- @Override
- public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
- throws IOException {
- String msg = new String(body,"utf-8");
- System.out.println("消费者1接收到的消息" + msg);
- try {
- Thread.sleep();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally{
- System.out.println("消费者1处理完成!");
- //手动回执
- channel.basicAck(envelope.getDeliveryTag(), false);
- }
- }
- };
- //监听队列
- //自动应答false
- boolean autoAck = false;
- channel.basicConsume(QUEUE_NAMW, autoAck, consumer);
- }
- }
此时消费者不会接收到消息
此种模式还是很耗时的,采用这种方式 降低了 Rabbitmq 的消息吞吐量
Confirm模式
概述
producer 端 confirm 模式的实现原理
开启 confirm 模式的方法 已经在 transaction 事务模式的 channel 是不能再设置成 confirm 模式的,即这两种模式是不能共存的。 生产者通过调用 channel 的 confirmSelect 方法将 channel 设置为 confirm 模式 核心代码:
编程模式
普通模式:
- import java.io.IOException;
- import java.util.concurrent.TimeoutException;
- import com.rabbitmq.client.Channel;
- import com.rabbitmq.client.Connection;
- import com.rabbitmq.util.ConnectionUtils;
- public class confirm{
- private static final String QUEUE_NAMW = "test_tx_confirm1";
- public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
- Connection conn = ConnectionUtils.getConnection();
- Channel channel = conn.createChannel();
- channel.queueDeclare(QUEUE_NAMW, false, false, false, null);
- //生产者调用confirmSelect,将channel设置为confirm模式
- channel.confirmSelect();
- String msg = "confirm";
- channel.basicPublish("", QUEUE_NAMW, null, msg.getBytes());
- if(!channel.waitForConfirms()){
- System.out.println("send failed");
- }else{
- System.out.println("send ok");
- }
- channel.close();
- conn.close();
- }
- }
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.util.ConnectionUtils;
public class TXsend {
private static final String QUEUE_NAMW = "test_tx_confirm1";
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
Connection conn = ConnectionUtils.getConnection();
Channel channel = conn.createChannel();
channel.queueDeclare(QUEUE_NAMW, false, false, false, null);
//1
//生产者调用confirmSelect,将channel设置为confirm模式
channel.confirmSelect();
//2
String msg = "confirm";
//批量发送
for(int i=1;i<=10;i++){
channel.basicPublish("", QUEUE_NAMW, null, msg.getBytes());
}
//3
//确认
if(!channel.waitForConfirms()){
System.out.println("send failed");
}else{
System.out.println("send ok");
}
channel.close();
conn.close();
}
}
- import java.io.IOException;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.SortedSet;
- import java.util.TreeSet;
- import java.util.concurrent.TimeoutException;
- import com.rabbitmq.client.Channel;
- import com.rabbitmq.client.ConfirmListener;
- import com.rabbitmq.client.Connection;
- import com.rabbitmq.util.ConnectionUtils;
- public class TXsend {
- private static final String QUEUE_NAMW = "test_tx_confirm3";
- public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
- Connection conn = ConnectionUtils.getConnection();
- Channel channel = conn.createChannel();
- channel.queueDeclare(QUEUE_NAMW, false, false, false, null);
- //生产者调用confirmSelect,将channel设置为confirm模式
- channel.confirmSelect();
- //未确认的消息标识
- final SortedSet<Long> confirmSet = Collections.synchronizedSortedSet(new TreeSet<Long>());
- //频道加一个监听
- channel.addConfirmListener(new ConfirmListener() {
- //回调/重发重试 可以1s之后再发 10s之后再发
- @Override
- public void handleNack(long deliveryTag, boolean multiple) throws IOException {
- if(multiple){
- System.out.println("handleNack-----multiple =1");
- confirmSet.headSet(deliveryTag+1).clear();;
- }else{
- System.out.println("handleNack-----multiple =0");
- confirmSet.remove(deliveryTag);
- }
- }
- //没问题的handleAck
- @Override
- public void handleAck(long deliveryTag, boolean multiple) throws IOException {
- if(multiple){
- System.out.println("handleAck-----multiple =1");
- confirmSet.headSet(deliveryTag+1).clear();;
- }else{
- System.out.println("handleAck-----multiple =0");
- confirmSet.remove(deliveryTag);
- }
- }
- });
- String msg = "confirm";
- //模拟插入数据
- while(true){
- long seqNo = channel.getNextPublishSeqNo();
- channel.basicPublish("", QUEUE_NAMW, null, msg.getBytes());
- confirmSet.add(seqNo);
- }
- }
- }
8、RabbitMQ-消息的确认机制(生产者)的更多相关文章
- (六)RabbitMQ消息队列-消息任务分发与消息ACK确认机制(PHP版)
原文:(六)RabbitMQ消息队列-消息任务分发与消息ACK确认机制(PHP版) 在前面一章介绍了在PHP中如何使用RabbitMQ,至此入门的的部分就完成了,我们内心中一定还有很多疑问:如果多个消 ...
- RabbitMQ消息队列(六)-消息任务分发与消息ACK确认机制(.Net Core版)
在前面一章介绍了在.Net Core中如何使用RabbitMQ,至此入门的的部分就完成了,我们内心中一定还有很多疑问:如果多个消费者消费同一个队列怎么办?如果这几个消费者分任务的权重不同怎么办?怎么把 ...
- JStorm源代码阅读——消息的确认机制
Acker //Acker相当于一个bolt,用于处理事件 public class Acker implements IBolt { private RotatingMap<Object, A ...
- RabbitMQ消息发布和消费的确认机制
前言 新公司项目使用的消息队列是RabbitMQ,之前其实没有在实际项目上用过RabbitMQ,所以对它的了解都谈不上入门.趁着周末休息的时间也猛补习了一波,写了两个窗体应用,一个消息发布端和消息消费 ...
- 十五、.net core(.NET 6)搭建RabbitMQ消息队列生产者和消费者的简单方法
搭建RabbitMQ简单通用的直连方法 如果还没有MQ环境,可以参考上一篇的博客,在windows系统上的rabbitmq环境搭建.如果使用docker环境,可以直接百度一下,应该就一个语句就可以搞定 ...
- 学习ActiveMQ(六):JMS消息的确认与重发机制
当我们发送消息的时候,会出现发送失败的情况,此时我们需要用到activemq为我们提供了消息重发机制,进行消息的重新发送.那么我们怎么知道消息有没有发送失败呢?activemq还有消息确认机制,消费者 ...
- 【转】RabbitMQ基础——和——持久化机制
这里原来有一句话,触犯啦天条,被阉割!!!! 首先不去讨论我的日志组件怎么样.因为有些日志需要走网络,有的又不需要走网路,也是有性能与业务场景的多般变化在其中,就把他抛开,我们只谈消息RabbitMQ ...
- RabbitMQ消息可靠性分析和应用
RabbitMQ流程简介(带Exchange) RabbitMQ使用一些机制来保证可靠性,如持久化.消费确认及发布确认等. 先看以下这个图: P为生产者,X为中转站(Exchange),红色部分为消息 ...
- JMS确认机制
JMS中为数不多的重点就是消息的确认机制,下面分别介绍J2EE和Spring的MessageListenerContainer的确认机制 J2EE中JMS确认机制 在JMS规范中一共4种确认方式 AU ...
- (转)RabbitMQ消息队列(九):Publisher的消息确认机制
在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...
随机推荐
- Web前端图形滑块检验组件实现
组件渲染图形: 初始化: ...
- java 自定义异常处理
package com.direct.work; import java.io.FileNotFoundException; import java.io.IOException; import ja ...
- cookie、session、分页
一.cookie HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情 ...
- jq中的isArray方法分析,如何判断对象是否是数组
<!DOCTYPE html> <html> <head> <title>jq中的isArray方法分析</title> <meta ...
- sql-(Cross||Outer)Apply
Apply - 涉及以下两个步骤中的一步或两步(取决于Apply的类型): 1.A1:把右表表达式应用于左表的行 2.A2:添加外部行 Apply运算符把右表表达式应用于左输入的每一行.右表达式可以引 ...
- OpenCV实现基于傅里叶变换的旋转文本校正
代码 先给出代码,再详细解释一下过程: #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp& ...
- 强化学习系列之:Deep Q Network (DQN)
文章目录 [隐藏] 1. 强化学习和深度学习结合 2. Deep Q Network (DQN) 算法 3. 后续发展 3.1 Double DQN 3.2 Prioritized Replay 3. ...
- unistd.h文件
转载地址:http://baike.baidu.com/link?url=nEyMMFYevs4yoHgQUs2bcfd5WApHUKx0b1ervi7ulR09YhtqC4txmvL1Ce3FS8x ...
- 131.007 Unsupervised Learning - Feature Selection | 非监督学习 - 特征选择
1 Why? Reason1 Knowledge Discovery (about human beings limitaitons) Reason2 Cause of Dimensionality ...
- 解决linux下fflush(stdin)无效
void clean_stdin(void) { int c; do { c = getchar(); } while (c != '\n' && c != EOF); }