RabbitMQ.NET In Window Service
工作中要求使用RabbitMQ,以Windows Service 模式启动,中间有遇到一些问题,网上大部分博客有误导倾向, 在这里做一个简单的记录,以免后面的人走坑;
1.
自动重新连接,不需要手动处理自动连接
AutomaticRecoveryEnabled = true //断开自动重新连接
2.因为是Windows Service ,与控制台程序不同,若是像Demo中直接使用Received ,那么可能只会接收一次消息,然后程序执行完毕退出
后来我就使用了While(true),当时测试能解决问题,后来发现运行久了没有消息接收会时不时的断开连接,出现错误消息提示:
【ErrorType】System.IO.EndOfStreamException
【TargetSite】T Dequeue()
【Message】SharedQueue closed
【Source】RabbitMQ.Client
【StackTrace】 at RabbitMQ.Util.SharedQueue`.Dequeue()
at ******
开始以为是RabbitMQ.Net的版本问题,观察对比了几次发现并不是这个问题,高版本的程序也存在这个问题,低版本的也有,而且只有在Windows Service中才会有这个错误,直接Debug测试时正常的,
这个错误很容易被忽略,应该感觉自己Debug没有问题,怎么到客户那里Windows Service就出错了,会以为是安装包或者是客户电脑的问题,后来发现是因为While(true)的问题;
网上这个问题的很多答案都是说是确认消息 自动确认又手动确认,反正很多,后来发现是没有用事件的原因;
在http://www.cnblogs.com/maanshancss/p/7905976.html 也提到了不用while(true),我开始还以为只是异常处理部分作者没有处理呢,实际上需要另外一种写法,针对的Window Service 的,文章后面会贴出来源码;
3.需要理解XP和Win7 etc. 不同操作系统中 Window Service 账户的区别
4.参考http://www.cnblogs.com/maanshancss/p/7905976.html
中的内容,有些是需要注意的
try
{ string amqEndpoint = System.Configuration.ConfigurationManager.AppSettings["MQEndpoint"].ToString();
string amqUsername = System.Configuration.ConfigurationManager.AppSettings["MQUserName"].ToString();
string amqPassword = System.Configuration.ConfigurationManager.AppSettings["MQPassword"].ToString();
var amqName = System.Configuration.ConfigurationManager.AppSettings["MQName"].ToString(); var exchangeType = "direct";
var uri = new Uri("amqp://" + amqEndpoint + "/");
var factory = new ConnectionFactory
{
UserName = amqUsername,
Password = amqPassword,
RequestedHeartbeat = ,
Endpoint = new AmqpTcpEndpoint(uri),
AutomaticRecoveryEnabled = true //断开自动重新连接
}; var connection = factory.CreateConnection();
var channel = connection.CreateModel();
channel.QueueDeclare(queue: amqName,
durable: true,
exclusive: false,
autoDelete: false,
arguments: null); //创建基于该队列的消费者,绑定事件
var consumer = new EventingBasicConsumer(channel);
//绑定消费者
channel.BasicConsume(queue: amqName, //队列名
noAck: false, //false:手动应答;true:自动应答
consumer: consumer); consumer.Received += (model, ea) =>
{
try
{
//TOOD 验证程序退出后消费者是否退出去了
var body = ea.Body; //消息主体
var message = Encoding.UTF8.GetString(body);
Logger.WriteAndShowLog(message);
// Method(message);
channel.BasicAck(ea.DeliveryTag, false);
}
catch (RabbitMQ.Client.Exceptions.OperationInterruptedException ex1)
{
Logger.CreateErrorLog(ex1, "OperationInterruptedException");
Thread.Sleep();
channel.BasicNack(ea.DeliveryTag, false, true);
}
catch (Exception ex)
{
Logger.CreateErrorLog(ex, "Exception");
Thread.Sleep();
channel.BasicNack(ea.DeliveryTag, false, true);
}
}; Console.ReadLine();
}
catch (System.Exception ex)
{
Logger.CreateErrorLog(ex);
Console.ReadLine();
}
与Demo不同的地方
var connection = factory.CreateConnection();
var channel = connection.CreateModel();
这样才不会直接消失;
RabbitMQ.NET In Window Service的更多相关文章
- C# window service的创建
其实我也是第一次在博客园写博客,看到那些高手说自己要多动手写博客,于是乎自己也尝试尝试. 废话不多说.这几天在研究window service,通过查找各种大神写的博客,我终于成功的自己写出来了. 下 ...
- 创建 window service 定时任务
参考文章:http://www.cnblogs.com/jack-liang/archive/2011/05/20/2051743.html 前段时间做过一个项目,前端系统提供添加定时任务,后端系统要 ...
- Window Service 计划任务
在ASP.NET中创建计划任务,就我个人而言,用过两种方式,一种是用SQL Server创建,把写好的SSIS包导入SQL Server创建的任务中,设置好时间让它去执行.还有一种就是利用window ...
- window service 开发
为了便于window service的调试和开发. 我整理了一下代码,方便大家查阅 App.config 设置启动时间 timerStart-10点 interval-3600000 1小时检查一次 ...
- C# window Service实现调用有UI的应用程序(关于win xp以后的window系统)
我开发的系统中有一接口程序(这里就称Task,是一个C#的Console Application)经常无故的死掉,导致第二天的数据不能正常解析,所以,我写了一个window service去监视Tas ...
- window service 创建
1:vs中创建一个 window servece 2.右键 添加安装程序 3.更改属性视图中的Account属性为LocalService(本地服务) 更改ServiceName为你自己的服务名称 ...
- streambase service 变为 window service启动
1.配置出.sbdeploy文件 2.安装streambase服务 streambase command line :--install-service 即可安装对应的的window service ...
- 【Window Service】关于Window Service的两三事
引言 Window Service通常用于寄宿WCF服务或者定时作业.下面记录一下它的用法. 创建 创建Window Service项目后,可以看到Program和Service1类.Program ...
- C# Window Service安装、卸载、恢复选项操作
using System;using System.Diagnostics;using System.Linq;using System.ServiceProcess; namespace ScmWr ...
随机推荐
- OC 数组以及字符串拼接与分割
//@""空的字符串对象-------分割 NSString * ptr = @"I am a man"; NSArray * array = [ptr com ...
- winform npoi excel 样式设置
IWorkbook excel = new HSSFWorkbook();//创建.xls文件 ISheet sheet = excel.CreateSheet("sheet1") ...
- 4月第4周业务风控关注 | 网络犯罪经济每年1.5万亿美元 GDP居全球第12位
本文由 网易云发布. 易盾业务风控周报每周呈报值得关注的安全技术和事件,包括但不限于内容安全.移动安全.业务安全和网络安全,帮助企业提高警惕,规避这些似小实大.影响业务健康发展的安全风险. 1.网络 ...
- PhoneGap原理
http://www.oschina.net/question/213217_46380
- day 94 RestFramework序列化组件与视图view
一 .复习 1. CBV流程 class BookView(View): def get(): pass def post(): pass #url(r'^books/', views.BookVie ...
- javar入门——基本数据类型
Java中的数据类型分为两类: 基本数据类型(或者称为原生数据类型) 引用数据类型 基本数据类型 8种:6种基本数据类型,1种字符型,1种布尔型 byte,short,int,long,float,d ...
- leetcode 105 106 从前序与中序遍历序列构造二叉树 从中序与后序遍历序列构造二叉树
题目: 105 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...
- python操作mongodb实例
安装pymongo扩展 import pymongo; client = pymongo.MongoClient(host='10.48.176.170',port=27017); db = clie ...
- Highcharts纯Javascript图表使用讲解
Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明文档,而中文版的文档网上甚少,且零散不全.这里,我把Highcharts常用的最核心的参 ...
- Java Web之Servlet中response、request乱码问题解决
Java Web之Servlet中response.request乱码问题解决 一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...