2013-12-09 3 views
0

Мне показалось странным, что в MSMQ есть метод под названием MessageQueue.Exists и MessageQueue.Create. Тем не менее, нет способа получения очереди с учетом ее пути, хотя два упомянутых метода принимают путь в качестве аргумента.MSMQ - Получить определенную очередь по пути

Как я могу получить очередь по своему пути??

я мог бы сделать:

MessageQueue.GetPrivateQueuesByMachine(".").First(m => m.Path == "something"); 

Но я бы не назвал это чистым, ни эффективным. Моя машина будет обрабатывать большое количество сообщений в очереди, в которых работает до 250 очередей.

Большинство этих очередей обрабатываются с сайта ASP.NET MVC, где я не могу «хранить» ссылку на очередь для последующего использования. Каждая очередь должна быть снова загружена для каждого запроса.

+0

Не могли бы вы подробнее рассказать о вашем сценарии? Если очереди выполняются с каждым запросом, что касается параллелизма и возможных условий гонки? –

+0

Есть ли необходимость использования MSMQ? RabbitMQ - мощная альтернатива, с возможностью создания и доступа к очередям исключительно с помощью ключа. – damienc88

+0

MSMQ - это требование да. Я предпочитаю не использовать третью сторону. –

ответ

0

, если очереди не создаются динамически, я бы поиграться следующий код:

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 
     } 

    } 


} 
Смежные вопросы