MSMQ - 此计算机上尚未安装消息队列

Posted

技术标签:

【中文标题】MSMQ - 此计算机上尚未安装消息队列【英文标题】:MSMQ - message queuing has not been installed on this computer 【发布时间】:2012-04-05 14:03:31 【问题描述】:

我编写了一个示例应用程序来写入开发服务器上的公共和私有队列。我的本地机器上没有安装消息队列。

我收到错误消息:此计算机上尚未安装消息队列。

错误出现在这一行:

MessageQueue.Exists(queueName)

这是完整的测试代码,所有已注释和未注释的私有和公共队列都会导致相同的错误。我在这里做错了什么?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Messaging;

namespace MsmqTest

    public partial class Form1 : Form
    
        //@"DIRECT=OS:devbox01\PRIVATE$\PrivateQueueDev";
        //@"DIRECT=TCP:192.168.6.102\PRIVATE$\PrivateQueueDev";
        private const string QueueName = @"DIRECT=TCP:192.168.6.102\PRIVATE$\PrivateQueueDev";


        //@"DIRECT=OS:devbox01\PublicQueueDev";
        //@"DIRECT=TCP:192.168.6.102\PublicQueueDev";
        private const string QueueNamePublic = @"DIRECT=TCP:192.168.6.102\PublicQueueDev";

        public Form1()
        
            InitializeComponent();
        

        private void Write_Click(object sender, EventArgs e)
        
            MessageQueue msgQ;
            string msgText = String.Format("Message: 0", DateTime.Now);
            try
            
                msgQ = GetQ(QueueNamePublic);
                msgQ.Send(msgText);
            
            catch (Exception ex)
            
                throw new Exception(ex.Message);
            
        

        private void Read_Click(object sender, EventArgs e)
        

        

        private MessageQueue GetQ(string queueName)
        
            MessageQueue msgQ;

            if(!MessageQueue.Exists(queueName))
            
                try
                
                    msgQ = MessageQueue.Create(queueName);
                
                catch (Exception ex)
                
                    throw new Exception("Error creating queue", ex);
                
            
            else
            
                try
                
                    msgQ = new MessageQueue(queueName);
                
                catch (Exception ex)
                
                    throw new Exception("Error getting queue", ex);
                
            
            return msgQ;
        

    

【问题讨论】:

【参考方案1】:

您需要在所有想要参与消息传输和接收的机器上install MSMQ。在这种情况下,这包括发送机器,例如您的本地机器。

这是因为 MSMQ 使用的存储转发消息模式。

http://en.wikipedia.org/wiki/Store_and_forward

当您向服务器“发送”消息时实际发生的情况是:

    本地队列管理器将消息写入本地临时队列。 本地队列管理器连接到远程队列管理器。 消息已传输。 远程队列管理器将消息写入远程队列。

【讨论】:

那么我有什么选择呢?我不想在用户机器上安装它,然后将发送消息。我可以使用 WCF 吗?能否请您指出一些可以提供帮助的示例代码? 如果你想使用 MSMQ,别无选择。我不认为在用户机器上启用它应该是一个问题。它是窗户的一部分。 我们有大约 15 到 20 个用户需要启用此功能。我可以用什么来代替 MSMQ?基本上,客户端将发送一个 id,然后侦听器将需要根据该 id 执行一些任务。它需要是一个队列式的流程,先进先出。 我所知道的所有排队替代方案(RabbitMQ 和 ZeroMQ)都依赖于两端的安装。排队保证每条消息的传递,恰好一次。为了实现这一点,您需要一个两端的客户端。如果你没有这个要求,那么你真的不需要使用排队,你可以使用网络服务调用或类似的东西。 谢谢,非常感谢您的帮助。【参考方案2】:

将 MSMQ 逻辑重构为服务并从您的代码中调用服务,传递消息。这样你只需要在服务器上安装 MSMQ。

【讨论】:

好主意;我会用这个。

以上是关于MSMQ - 此计算机上尚未安装消息队列的主要内容,如果未能解决你的问题,请参考以下文章

从远程队列中读取消息

在window 2008r2开发服务器上安装MSMQ消息队列

转MSMQ消息队列安装

进行事务处理时消息未到达 MSMQ

MSMQ 控制台显示消息计数,但没有私有队列的消息

MSMQ消息队列的安装启用