【问题标题】:MSMQ - message queuing has not been installed on this computerMSMQ - 此计算机上尚未安装消息队列
【发布时间】: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;
        }

    }
}

【问题讨论】:

    标签: msmq


    【解决方案1】:

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

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

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

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

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

    【讨论】:

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

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

    【讨论】:

    • 好主意;我会用这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2011-05-12
    • 2019-10-01
    • 2013-01-19
    • 1970-01-01
    • 2021-03-17
    • 2013-04-09
    相关资源
    最近更新 更多