如何成功发布一个MSMQ的Windows服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何成功发布一个MSMQ的Windows服务相关的知识,希望对你有一定的参考价值。

因为MSMQ的使用需要不断的查看队列是否有新消息,所以一般是结合Windows的服务,当然也可以用一个不关闭的Winform程序,不过前者更好一些,不怕被人误关。

 

完成MSMQ的WindowsService项目后,将服务项目添加到Windows 服务中。

 

①如果访问的是一个已经存在的队列,那么启动的时候会报错误【本地计算机上的XXXX服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止】

这是因为没有分配权限。

 处理方法:右击要访问的队列 ->安全 

EveryoneANONYMOUS LOGON的完全控制分别勾选

 技术分享

 

②发送消息到远程队列

访问本地队列时,队列的路径格式及使用是这样子的

var mqPath = @".\Private$\MyMQ";
MessageQueue _MQ;
if (MessageQueue.Exists(mqPath))
{
    _MQ = new MessageQueue(mqPath);
}
else
{
    _MQ = MessageQueue.Create(mqPath);
}

  

访问远程队列时,代码略有不同:

1.远程队列的路径格式:string path = @"Formatname:DIRECT=tcp:192.168.1.11\Private$\myMQ";  关键字不区分大小写

2.MSMQ 判断队列是否存在的方法(MessageQueue.Exists(string path))和创建队列(MessageQueue.Create(string path)),都是不支持远程队列的。

  1.使用Exists方法会出现错误无法确定具有指定格式名的队列是否存在。

  2.使用Create方法会出现错误【无法创建路径为 FormatName:DIRECT=tcp:192.168.1.11\Private$\myMQ 的队列

  3.由于前两条的限制,如果要访问远程专用队列,则必须保证事先在远程机器上该队列是存在的。

var path = @"FormatName:DIRECT=tcp:192.168.1.11\Private$\myMQ"; 
MessageQueue mq = new MessageQueue(queuePath);

 

  4.当发送消息到远程队列时,系统会在本机的传出队列下创建一个临时队列,每发送一条消息,该消息都会先存在临时队列中,这样做的目的是防止因远程队列无法访问而丢失消息。

    不过要特别注意的是,如果远程机器不能成功连接,则消息就一直在临时队列中存放;如果能成功连接,即使要访问的队列并不存在,消息发送程序也不会报错,并且临时队列中的消息会删除。

    所以  一定要保证先在远程服务器上建好队列。传出队列具体信息如下图:

技术分享技术分享

   5.如果事务型属性不匹配,消息将无法传递。系统不会返回任何错误,但该条消息却会丢掉。

 

 

以上是关于如何成功发布一个MSMQ的Windows服务的主要内容,如果未能解决你的问题,请参考以下文章

研华工控机win7系统安装WINCC更改windows功能MSMQ服务器提示出现错误并非所有的功能被成功更改怎么办?

如何安装消息队列

如何并行处理 MSMQ 消息

如何为 MSMQ 创建 C# 侦听器服务作为 Windows 服务

包括 MSMQ 作为我的应用程序的先决条件

MSMQ 事务性消息传递如何工作?