【问题标题】:Cant get MSMQ to work properly无法让 MSMQ 正常工作
【发布时间】:2013-02-13 07:09:40
【问题描述】:

当我尝试发送到队列时,我一直收到错误消息

指定的格式名称不支持请求的操作。例如,不能删除直接队列格式名称。

我的队列名称存储在配置文件中,如下所示

"FormatName:Direct=OS:MyComputerName\PRIVATE$\MyQueue"

存在 2 个队列,每个队列都设置了权限,以便每个人都拥有完全控制权。

您可以假设 SyncUser = "EVERYONE" 或 "My_Domain\operator"

//init the queues
qSync = new MessageQueue(queueName + "-sync")
            {Formatter = new XmlMessageFormatter(new Type[] {typeof (String)})};

qClient = new MessageQueue(queueName + "-client")
            {Formatter = new XmlMessageFormatter(new Type[] { typeof(String) })};

创建队列不会导致任何错误,但是当我调用此发送函数时会收到错误

**Send(qSync, "This is a message");** //Example

public void Send(MessageQueue queue, string msg)
{
    try
    {
        queue.Send(msg);
    }
    catch (MessageQueueException mqx)
    {
        var e = string.Format("Failed to Send - {0} | {1}", queue.QueueName, mqx.Message);
        OnSynchronizerMonitor(new SyncEvent(e));
    }
}

任何帮助将不胜感激。

编辑

似乎我的消息 ARE 到达了他们的远程队列目的地,但应用程序仍然在发送的每条消息上抛出该错误。如果我在调试时查看 MessageQueues (qSync|qClient),则该错误会在几个内部字段中出现,甚至在使用之前。

【问题讨论】:

  • 您是否要发送到远程计算机?如果一切都在本地机器上运行,一切正常吗?你的队列也是事务性的吗?
  • 是的,它是一台远程机器,Slave 将在本地运行,它似乎运行良好,但它所做的一切都是从队列中读取的,所以目前它还没有经过很好的测试。它是一个非事务队列
  • 您正在调用 Queue.Send() 但您没有显示 Queue 是如何设置的。
  • 抱歉,代码已更新。 “队列”是传递给函数的任何队列。我这样做是因为我有多个使用相同发送逻辑的队列。
  • 您确定可以从远程计算机访问 PRIVATE 队列吗?我会说这行不通。

标签: c# .net msmq


【解决方案1】:

我希望有人可以为我确认这一点,因为我似乎无法找到任何支持这一点的论坛问题或文档,但似乎 MessageQueue 与我的事件设置存在问题。

我删除了事件调用,只是硬编码了队列创建并在我的主进程中发送到它的位置,一切正常。

我的设置是这样的:

服务 - 创建处理器、同步器并设置事件。

处理器启动一个线程,它在其中处理字符串事务,在成功的过程中,事务需要通过同步器发送,因此处理器触发事件​​。

Synchronizer 已经创建了队列,正在等待触发事件以发送消息。

如果有人能说明这可能是一个跨线程问题还是我系统中的一个怪癖,我们将不胜感激。

**经过更多的研究和一些试验和错误,似乎由于事件的跨线程复杂性,我得到了错误。我的猜测是,从与创建它的线程不同的线程更新 UI 对象是一个类似的问题。该错误本质上是所有权问题。虽然消息仍然存在,但队列抱怨它的原始所有者不是发起呼叫的人。

【讨论】:

    猜你喜欢
    • 2012-09-05
    • 2017-11-06
    • 2011-09-06
    • 1970-01-01
    • 2023-03-10
    • 2020-10-16
    • 2014-01-15
    • 2019-07-29
    相关资源
    最近更新 更多