RabbitMQ阻塞读取时数据时,关闭channel引起的问题和解决方案
项目场景:
最近在项目中使用了RabbitMq,其中有一个功能必须能随时切断RabbitMq的coumser。第一时间写出来的代码如下:
伪代码:
while(flag){ QueueingConsumer.Delivery delivery=consumer.nextDelivery();
String message = new String(delivery.getBody());
//doing someting strange
//...... } //另外一个项目开始关闭 public void closeConsumer{
channel().close();
connection().close();
}
closeConsumer();
通过关闭channel,消费者自然会关闭。然而,项目开始报错:
channel关闭抛出ShutdownSignalException,抛出异常就表示这种关闭方式是不合理的。有必要去探索一下是否有更优雅的链接关闭方式。
先看consumer的源码:
public Delivery nextDelivery()throws InterruptedException, ShutdownSignalException, ConsumerCancelledException{
return handle(_queue.take());
}
而这里_queue其实是一个 LinkedBlockingQueue,LinkedBlockingQueue是一个单向链表实现的阻塞队列。nextDelivery()方法使用LinkedBlockingQueue的take方法实现了阻塞。这个地方感觉不好操作。但是QueueingConsumer还有另外一个读取数据的方法,源码如下:
public Delivery nextDelivery(long timeout)throws InterruptedException, ShutdownSignalException, ConsumerCancelledException{
return handle(_queue.poll(timeout, TimeUnit.MILLISECONDS));
}
这边设定了超时时间。虽然没想到优雅关闭消费者的方法,但是利用超时时间来修改一下读取数据的方法还是可以的。代码如下:
try{
while(flag){
QueueingConsumer.Delivery delivery = consumer.getDeliveryMessage(10000);
if(consumer.getState()==Consumer.Status.Stopped.getValue()){
break;
}
if(delivery==null){
continue;
}
String message = new String(delivery.getBody());
//....dosomething
}
}finally {
if(consumer!=null){
consumer.closeConnection();
}
} public void closeConnection{
channel().close();
connection().close();
} //另外一个线程关闭consumer
consumer.setStatus(Consumer.Status.Stopped);
总结:这种关闭方式可以让Mq关闭连接时不抛出异常,比之前的方式好一点。但可能并不是最好的方法。如果有更好的方案,请留言告诉我,谢谢
RabbitMQ阻塞读取时数据时,关闭channel引起的问题和解决方案的更多相关文章
- Hive读取外表数据时跳过文件行首和行尾
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 有时候用hive读取外表数据时,比如csv这种类型的,需要跳过行首或者行尾一些和数据无关的或者自 ...
- wcf序列化大对象时报错:读取 XML 数据时,超出最大
错误为: 访问服务异常:格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出 错: request.InnerException 消息是“反序 ...
- InnerException 消息是“反序列化对象 属于类型 *** 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。(注意细节)
WEB站点在调用我们WCF服务的时候,只要传入的参数过长,就报如下错误: 格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: formD ...
- python使用xlrd读取excel数据时,整数变小数的解决办法
python使用xlrd读取excel数据时,整数变小数: 解决方法: 1.有个比较简单的就是在数字和日期的单元格内容前加上一个英文的逗号即可.如果数据比较多,也可以批量加英文逗号的前缀(网上都有方法 ...
- Web Service 或 WCF调用时读取 XML 数据时,超出最大字符串内容长度配额(8192)解决方法
1.调用服务时服务 当我们使用 Web Service 或 WCF 服务时,常把读取的数据转化为string类型(xml格式),当数据量达到一 定数量时,会出现以下异常: 错误:格式化程序尝试对消息反 ...
- 读取 XML 数据时,超出最大字符串内容长度配额 (8192)
格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://www.thermo.com/informatics/xmlns/limswebservice 进行反序列化时出错: Process ...
- 格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: GetLzdtArticleResult。InnerException 消息是“反序列化对象 属于类型 lzdt.DTO.Dtolzdt[] 时出现错误。读取 XML 数据时,超出最大
当遇到这个错误的时候郁闷了好长时间报错是字符串长度过大可是修改了MaxStringContentLength”属性的值却不起作用最后才发现还是因为配置文件配置的问题在服务端 格式化程序尝试对消息反序列 ...
- oledbdataadapter 读取excel数据时,有的单元格内容不能读出
表现:excel中某列中,有的单元格左上角有绿色箭头标志,有的没有,c#编写读取程序,但是只能读取出带绿色箭头的单元格中的内容,其余不带的读取不到内容 原因:excel中单元格因为是文本格式而存储了数 ...
- pandas读取csv数据时设置index
比如读取数据时想把第一列设为index,那么只需要简单的 pd.read_csv("new_wordvecter.csv",index_col=[0]) 这里index_col可以 ...
随机推荐
- centos6.9(Linux系统)安装VMware tools教程
VMware tools是虚拟机上虚拟硬件的驱动,可以实现鼠标的无缝移出移入,剪贴板共享,共享文件夹等功能.很多的Linux系统初学者,在安装centos6.9系统时,没有安装VMware tools ...
- 一道变态的Javascript面试题
转载http://cymoft.blog.51cto.com/324099/1260099 1 2 3 4 5 6 7 8 9 f = function() {return true;}; g = ...
- php 的开发工具
通过上篇我们已经配置好了php的开发环境,我们就可以在这个模拟的环境下运行我们编写的php代码了. 在编写代码前,先安装一个自己喜欢的代码编辑器. 1.sublime text Sublime Tex ...
- 开源项目 easydownload
一个用于下载的 android library库, 源码 支持多线程断点下载, 支持消息通知. 支持优先级下载. 支持暂停,继续,删除下载列表 支持多服务器下载. 使用方式 compile 'co ...
- Django的分页器(paginator)
先导入模块: from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 分页器paginator 下面的所有方法 ...
- 大道至简第一章Java伪代码读后感
import.java.大道至简.*; //周爱民 import.java.读后感*; public class shawanyia { //1. 编程的精义 while(山没有消失) {if(愚公没 ...
- Solidity教程系列1 - 类型介绍
现在的Solidity中文文档,要么翻译的太烂,要么太旧,决定重新翻译下,再加上代码事例讲解. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果 ...
- 一个部署了tomcat服务的linux服务器,运行一段时间后出现内存和空间不足的问题
—— 前段时间项目上的事比较忙,期间笔记都是临时存在本地txt,这些天有点时间了,整理出来,以便日后查看: linux 查看内存使用情况:free -m 释放缓存: /proc/sys/vm/drop ...
- PHP7源码安装MongoDB和MongoDB拓展
一.安装MongoDB 1.创建mongodb用户组和用户 groupadd mongodb useradd -r -g mongodb -s /sbin/nologin -M mongodb 2.下 ...
- MySQL · 引擎特性 · InnoDB 事务系统
前言 关系型数据库的事务机制因其有原子性,一致性等优秀特性深受开发者喜爱,类似的思想已经被应用到很多其他系统上,例如文件系统等.本文主要介绍InnoDB事务子系统,主要包括,事务的启动,事务的提交,事 ...