工作中要求使用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的更多相关文章

  1. C# window service的创建

    其实我也是第一次在博客园写博客,看到那些高手说自己要多动手写博客,于是乎自己也尝试尝试. 废话不多说.这几天在研究window service,通过查找各种大神写的博客,我终于成功的自己写出来了. 下 ...

  2. 创建 window service 定时任务

    参考文章:http://www.cnblogs.com/jack-liang/archive/2011/05/20/2051743.html 前段时间做过一个项目,前端系统提供添加定时任务,后端系统要 ...

  3. Window Service 计划任务

    在ASP.NET中创建计划任务,就我个人而言,用过两种方式,一种是用SQL Server创建,把写好的SSIS包导入SQL Server创建的任务中,设置好时间让它去执行.还有一种就是利用window ...

  4. window service 开发

    为了便于window service的调试和开发. 我整理了一下代码,方便大家查阅 App.config 设置启动时间 timerStart-10点 interval-3600000  1小时检查一次 ...

  5. C# window Service实现调用有UI的应用程序(关于win xp以后的window系统)

    我开发的系统中有一接口程序(这里就称Task,是一个C#的Console Application)经常无故的死掉,导致第二天的数据不能正常解析,所以,我写了一个window service去监视Tas ...

  6. window service 创建

    1:vs中创建一个 window servece 2.右键 添加安装程序 3.更改属性视图中的Account属性为LocalService(本地服务) 更改ServiceName为你自己的服务名称   ...

  7. streambase service 变为 window service启动

    1.配置出.sbdeploy文件 2.安装streambase服务 streambase command line :--install-service 即可安装对应的的window service ...

  8. 【Window Service】关于Window Service的两三事

    引言  Window Service通常用于寄宿WCF服务或者定时作业.下面记录一下它的用法. 创建 创建Window Service项目后,可以看到Program和Service1类.Program ...

  9. C# Window Service安装、卸载、恢复选项操作

    using System;using System.Diagnostics;using System.Linq;using System.ServiceProcess; namespace ScmWr ...

随机推荐

  1. winform npoi excel 样式设置

    IWorkbook excel = new HSSFWorkbook();//创建.xls文件 ISheet sheet = excel.CreateSheet("sheet1") ...

  2. .net mvc使用FlexPaper插件实现在线预览PDF,EXCEL,WORD的方法

    FlexPaper插件可以实现在浏览器中在线预览pdf,word,excel等. 在网上看到很多关于这个插件实现预览的技术,但是很难做到word和excel在线预览. pdf很好实现. 首先下载相关的 ...

  3. In file included from adlist.c:34:0: zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

    问题: In file included from adlist.c:34:0:zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录 解决: make ...

  4. 【cocos2d-x 手游研发----研发思路及感想】

          我半年前进入了目前的这家做教育行业的公司(在此之前一直从事原生态开发手游的迷茫之路),学习是一件很快乐的事情,来到这家公司我有了很多时间去学习,不管是公司业务,还是其他技术相关的.于是开始 ...

  5. log Log4NET配置

    Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过 日志查看系统的运行过程,从而发现系统的问题.日志的作用:将 ...

  6. pageadmin CMS网站建设教程:如何修改用户密码?

    pageadmin CMS网站建设教程: 当我们想修改密码,该如何修改呢? 1. 首先,登录会员中心,会员中心的地址是在网址后面加上/member/login: 2. 例:我的网站地址是localho ...

  7. 网络流——二分图最优匹配KM算法

    前言 其实这个东西只是为了把网络流的内容凑齐而写的(反正我是没有看到过这样子的题不知道田忌赛马算不算) 算法过程 我们令左边的点(其实二分图没有什么左右)为女生,右边的点为男生,那么: 为每一个女生定 ...

  8. CentOS 安装 linux kernel 源码

    原文链接:https://blog.csdn.net/qaz1qaz1qaz2/article/details/52825389 1.下载系统包yum install rpm-buildyum ins ...

  9. Python3.5 学习十

    多进程: 多线程和多进程的区别: Python多线程不适合CPU操作密集型的任务,适合IO操作密集型的任务(IO操作不占用CPU) Python折中解决多线程不能真正同步运算的方案是:起多个进程,每个 ...

  10. [Python] 模拟登录网站(。。为了之后操作数据。。)

    我司的内部管理(Web)系统(日报)着实..(mafan).. 所以,就想自己动手增加一下便利性. 计划是, - 桌面程序 用来方便记录(按自己格式,数据随时保存到sqlite中,备用) 通过一览来确 ...