C# MSMQ-按路径获取特定队列

C# MSMQ-按路径获取特定队列,c#,msmq,C#,Msmq,我觉得奇怪的是,在MSMQ中有一个名为MessageQueue.Exists和MessageQueue.Create的方法。然而,即使前面提到的两种方法将路径作为参数,也没有方法可以检索给定路径的队列 如何通过队列路径有效地检索队列 我可以做到: MessageQueue.GetPrivateQueuesByMachine(".").First(m => m.Path == "something"); 但我不认为这是纯粹的或有效的。我的机器将处理大量的队列消息,目前运行的队列多达250个

我觉得奇怪的是,在MSMQ中有一个名为
MessageQueue.Exists
MessageQueue.Create
的方法。然而,即使前面提到的两种方法将路径作为参数,也没有方法可以检索给定路径的队列

如何通过队列路径有效地检索队列

我可以做到:

MessageQueue.GetPrivateQueuesByMachine(".").First(m => m.Path == "something");
但我不认为这是纯粹的或有效的。我的机器将处理大量的队列消息,目前运行的队列多达250个


这些队列中的大多数都是从ASP.NETMVC站点处理的,在那里我无法“存储”队列的引用以供以后使用。每个请求都需要重新获取每个队列。

如果队列不是动态创建的,我将使用以下代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Messaging;
static class MessageQueueHelper
{
    private static Dictionary<string, MessageQueue> queues;
    public static MessageQueue GetPrivateQueueByName(string machinename, string queueName)
    {

        if (machinename == ".") {
            machinename = Environment.MachineName;
        }
        if (queues == null) {
            queues = new Dictionary<string, MessageQueue>();
            try {
                dynamic qlist = MessageQueue.GetPrivateQueuesByMachine(machinename).ToList;
                foreach (MessageQueue q in qlist) {
                    queues.Add(q.MachineName.ToLowerInvariant + q.Path.ToLowerInvariant, q);
                }
            } catch (Exception ex) {
                //access denied? server not found?
                throw new Exception(ex.Message);
            }
        }

        string key = string.Format("{0}FormatName:DIRECT=OS:{0}\\private$\\{1}", machinename, queueName).ToLowerInvariant;
        try {
            return queues.Item(key);
        } catch (Exception ex) {
            return null; //probably key not found
        }

    }


}
使用系统;
使用系统集合;
使用System.Collections.Generic;
使用系统数据;
使用系统诊断;
使用系统消息传递;
静态类MessageQueueHelper
{
私有静态字典队列;
公共静态消息队列GetPrivateQueueByName(字符串machinename,字符串queueName)
{
if(machinename==“){
machinename=Environment.machinename;
}
if(队列==null){
队列=新字典();
试一试{
动态qlist=MessageQueue.GetPrivateQueuesByMachine(machinename).ToList;
foreach(qlist中的MessageQueue q){
添加(q.MachineName.ToLowerInvariant+q.Path.ToLowerInvariant,q);
}
}捕获(例外情况除外){
//拒绝访问?找不到服务器?
抛出新异常(例如消息);
}
}
string key=string.Format(“{0}FormatName:DIRECT=OS:{0}\\private$\\{1}”,machinename,queueName).ToLowerInvariant;
试一试{
返回队列。项(键);
}捕获(例外情况除外){
return null;//可能找不到密钥
}
}
}

使用
消息队列


你能详细说明一下你的情况吗?如果每个请求都获取队列,那么并发性和可能的争用条件如何?是否需要使用MSMQ?RabbitMQ是一种功能强大的替代方案,能够完全通过密钥创建和访问队列。MSMQ是一项要求。我不喜欢使用第三方。您可以使用公共队列和active directory吗?
MessageQueue mq = new MessageQueue(queuePath);