- 浏览: 103876 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sheungxin:
@仑山中鸟 @zl_xzl 不好意思,代码已丢。。。自己动手试 ...
自定义类加载器与spring的集成 -
昆仑山中鸟:
同求代码,看的云里雾里。自定义监听器WebContextLis ...
自定义类加载器与spring的集成 -
xzl_xzl:
代码都是片段,能否提供下具体的代码,正好我也有类似的需求。但我 ...
自定义类加载器与spring的集成 -
sheungxin:
@add2ws 我试下,多谢!
基于oracle的增量数据采集实现总结 -
add2ws:
用得着这么麻烦么,直接用kettle插入更新,配合oracle ...
基于oracle的增量数据采集实现总结
- 消息确认机制
1、从实验来看,消息的确认机制只是确认publisher发送消息到broker,由broker进行应答,不能确认消息是否有效消费。
2、而为了确认消息是否被发送给queue,应该在发送消息中启用参数mandatory=true,使用ReturnListener接收未被发送成功的消息。
3、接下来就需要确认消息是否被有效消费。publisher端目前并没有提供监听事件,但提供了应答机制来保证消息被成功消费,应答方式:
basicAck:成功消费,消息从队列中删除
basicNack:requeue=true,消息重新进入队列,false被删除
basicReject:等同于basicNack
basicRecover:消息重入队列,requeue=true,发送给新的consumer,false发送给相同的consumer
- 应答模式之transaction机制
package com.demo.mq.rabbitmq.example11; import java.io.IOException; import java.io.Serializable; import org.apache.commons.lang3.SerializationUtils; import com.demo.mq.rabbitmq.MqManager; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.DefaultConsumer; import com.rabbitmq.client.Envelope; /** * 应答模式之transaction机制 * @author sheungxin * */ public class TxDemo { private static String exchange_name=""; private static String queue_name="tx_queue"; /** * transaction机制发送消息,事务机制:手动提交和回滚 * 执行txCommit,消息才会转发给队列进入ready状态 * 执行txRollback,消息被取消 * @param mes * @throws Exception */ public static void txSend(Serializable mes) throws Exception{ Connection conn=MqManager.newConnection(); Channel channel=conn.createChannel(); //开启transaction机制 channel.txSelect(); channel.queueDeclare(queue_name,false,false,true,null); for(int i=0;i<10;i++){ try{ channel.basicPublish(exchange_name, queue_name, null, SerializationUtils.serialize(mes.toString()+i)); //do something // int n=5/0;//试验消息回滚 channel.txCommit();//提交消息 System.out.println("发布消息"+mes.toString()+i); }catch(Exception e){ channel.txRollback();//异常,取消消息 System.out.println("回滚消息"+mes.toString()+i); } } } /** * transaction机制接收消息,事务机制:手动提交和回滚 * 消费者需要执行basicAck,并txCommit(自动应答模式自动处理,本例中采用手动应答模式) * @throws Exception */ public static void txRecv() throws Exception{ Connection conn=MqManager.newConnection(); Channel channel=conn.createChannel(); //开启transaction机制 channel.txSelect(); channel.queueDeclare(queue_name,false,false,true,null); //关闭自动应答模式(自动应答模式不需要ack、txCommit),需要手动basicAck,并执行txCommit channel.basicConsume(queue_name, false, new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws IOException{ String mes=SerializationUtils.deserialize(body); System.out.println("tx Received :'"+mes+"' done"); channel.basicAck(envelope.getDeliveryTag(), false); channel.txCommit(); } }); } public static void main(String[] args) throws Exception { txSend("hello world!"); txRecv(); } }
- 应答模式之confirm机制
2、confirmSelect,进入confirm消息确认模式,确认方式:1、异步ConfirmListener;2、同步waitForConfirms
3、ConfirmListener、waitForConfirms均需要配合confirm机制使用
4、暂时未弄明白confirm机制在consumer的应用,ConfirmListener在consumer中无效
5、basicNack、basicReject:参数requeue=true时,消息会重新进入队列
6、autoDelete队列在消费者关闭后不管是否还有未处理的消息都会关闭掉
package com.demo.mq.rabbitmq.example11; import java.io.IOException; import java.io.Serializable; import org.apache.commons.lang3.SerializationUtils; import com.demo.mq.rabbitmq.MqManager; import com.rabbitmq.client.Channel; import com.rabbitmq.client.ConfirmListener; import com.rabbitmq.client.Connection; /** * 应答模式之confirm机制:消息发送 * @author sheungxin * */ public class ConfirmSend { private static String exchange_name=""; private static String queue_name="tx_queue"; /** * confirm机制:确认publisher发送消息到broker,由broker进行应答(不能确认是否被有效消费) * confirmSelect,进入confirm消息确认模式,确认方式:1、异步ConfirmListener;2、同步waitForConfirms * ConfirmListener、waitForConfirms均需要配合confirm机制使用 * @param mes * @throws Exception */ public static void txSend(Serializable mes) throws Exception{ Connection conn=MqManager.newConnection(); Channel channel=conn.createChannel(); //开启transaction机制 channel.confirmSelect(); channel.queueDeclare(queue_name,false,false,true,null); //异步实现发送消息的确认(此部分的消息确认是指发送消息到队列,并非确认消息的有效消费) channel.addConfirmListener(new ConfirmListener() { @Override public void handleNack(long deliveryTag, boolean multiple) throws IOException { //multiple:测试发现multiple随机true或false,原因未知 System.out.println("Nack deliveryTag:"+deliveryTag+",multiple:"+multiple); } @Override public void handleAck(long deliveryTag, boolean multiple) throws IOException { System.out.println("Ack deliveryTag:"+deliveryTag+",multiple:"+multiple); } }); for(int i=0;i<10;i++){ channel.basicPublish(exchange_name, queue_name, null, SerializationUtils.serialize(mes.toString()+i)); } // channel.waitForConfirms();//同步实现发送消息的确认 System.out.println("-----------"); channel.close(); conn.close(); } public static void main(String[] args) throws Exception { txSend("hello world!"); } }
package com.demo.mq.rabbitmq.example11; import java.io.IOException; import org.apache.commons.lang3.SerializationUtils; import com.demo.mq.rabbitmq.MqManager; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.DefaultConsumer; import com.rabbitmq.client.Envelope; /** * 应答模式之confirm机制:消息接收 * @author sheungxin * */ public class ConfirmRecv { private static String queue_name="tx_queue"; /** * confirm机制:暂时未弄明白confirm机制在consumer的应用,ConfirmListener在consumer中无效 * basicNack、basicReject:参数requeue=true时,消息会重新进入队列 * autoDelete队列在消费者关闭后不管是否还有未处理的消息都会关闭掉 * @throws Exception */ public static void txRecv() throws Exception{ Connection conn=MqManager.newConnection(); Channel channel=conn.createChannel(); //开启transaction机制 // channel.confirmSelect(); //autoDelete,true只要被消息 channel.queueDeclare(queue_name,false,false,true,null); //关闭自动应答模式 channel.basicConsume(queue_name, false, new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws IOException{ String mes=SerializationUtils.deserialize(body); //multiple批量提交,true提交小于参数中tag消息 long n=envelope.getDeliveryTag()%3; if(n==0){ channel.basicAck(envelope.getDeliveryTag(), false); }else if(n==1){ //requeue,true重新进入队列 channel.basicNack(envelope.getDeliveryTag(), false, true); }else{ //requeue,true重新进入队列,与basicNack差异缺少multiple参数 channel.basicReject(envelope.getDeliveryTag(), true); } try { Thread.sleep(2*1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println((n==0?"Ack":n==1?"Nack":"Reject")+" mes :'"+mes+"' done"); } }); } public static void main(String[] args) throws Exception { txRecv(); } }
发表评论
-
RabbitMQ使用场景练习:STOMP plugin
2016-12-22 10:32 4131STOMP plugin Stomp是一个简单的消息 ... -
RabbitMQ使用场景练习:Validated User ID、Length Limit(十二 )
2016-12-16 15:14 1358Validated User ID 发送消息时指定userid ... -
RabbitMQ使用场景练习:优先级队列(十)
2016-12-14 16:05 3609优先级队列 只有当消费者不足,不能及时进行消费的情况 ... -
RabbitMQ使用场景练习:监听器Listener(九)
2016-12-13 21:23 8022监听器 RabbitMQ中监听器有ReturnLis ... -
RabbitMQ使用场景练习:延迟队列(八)
2016-12-13 17:42 5808延时队列 在实际 ... -
RabbitMQ使用总结:持久化
2016-12-13 10:29 2003持久化 RabbitMQ的 ... -
RabbitMQ使用场景练习:RPC(七)
2016-12-08 17:51 2601RPC,同步消息 RabbitMQ默认的consum ... -
RabbitMQ使用场景练习:Headers(六)
2016-12-08 15:28 3000Headers转发器 消息发送时可以在header中 ... -
RabbitMQ使用场景练习:主题Topic(五)
2016-12-06 17:26 2408主题转发器(Topic) Topic转发器的功效包含 ... -
RabbitMQ使用场景练习:路由选择Routing(四)
2016-12-06 17:02 782路由选择(Routing) Routing即按照某条 ... -
RabbitMQ使用场景练习:发布/订阅(三)
2016-12-05 17:30 1254发布/订阅 即实现单点发送消息,多点接收。使用fan ... -
RabbitMQ使用场景练习:工作队列(二)
2016-12-05 17:11 1154工作队列 工作队列的好处在于多个工作线程共享执行任务 ... -
RabbitMQ使用场景练习:入门实例(一)
2016-12-05 16:20 1654注意要点 同一队列多次创建://此处声明队列为了防止接收者 ... -
RabbitMQ的管理与监控
2016-11-30 17:08 1594开启management plugin功能 1、managem ... -
RabbitMQ的安装
2016-11-30 16:02 7451、RabbitMQ安装 官网下载地址:http://www ...
相关推荐
RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了一个经纪人(Broker)构架,这意味着消息在发送...
RabbitMQ实战: 高效部署分布式消息队列,高质量文档分享,请珍惜!
RabbitMQ实战 高效部署分布式消息队列 RabbitMQ实战 高效部署分布式消息队列
SpringBoot整合RabbitMQ 实现消息发送确认与消息接收确认机制 源码及教材 可以参考博客: https://blog.csdn.net/qq_29914837/article/details/93376741
RabbitMQ,作为一款流行的开源消息队列系统,因其高效、可靠、易于扩展而被广泛应用。本文档详细阐述了在生产环境中搭建RabbitMQ集群的步骤和策略,从而为企业提供更高的可用性、并发处理能力和消息处理效率。文档...
rabbitmq-server-3.9.11.exe
【课程目录】:---第一章:RabbitMQ介绍----1-什么是消息中间件.mp4----2-RabbitMQ消息队列安装:window环境.mp4----3-RabbitMQ消息队列安装 :Linux环境.mp4----4-Rabbitmq入口示例:server.mp4----5-rabbitmq入口...
以抢购为例, 给抢购用户发布消息
rabbitmq + spring boot 消息确认、持久化、备用交换机、死信交换机等demo代码
如题,C#的Demo项目:RabbitMQ封装和使用, 引用了RabbitMQ.Client 版本:3.6.9 RabbitMQ .NET客户端操作类库, 并简单展示了3种Exchange的使用
理解Confirm消息确认机制 消息的确认,是指生产者投递消息后,如果Broker收到消息,则会给我们生产者一个应答。生产者进行接收应答,用来确定这条消息是否正常的发送到Broker,这种方式也是消息的可靠性投递的核心...
RabbitMQ实战:高效部署分布式消息队列pdf版 很详细的rabbitMQ实战教程
RabbitMQ实战 高效部署分布式消息队列 附带目录 高清完整版 PDF下载
RabbitMQ实战:高效部署分布式消息队列 探索消息通信世界 打造24×7×365无间断工作环境
RabbitMQ实战:高效部署分布式消息队列 带目录书签高清PDF
rabbitmq实例 包括: 基于java的websocket消息推送,以及spring boot集成方式的消息推送 基于html5的websocke协议实现,html直接与rabbitmq建立链接,进行消息推送和接收 技术学习交流:635278789
请下载RabbitMQ实战:高效部署分布式消息队列 02解压