Куда делась моя очередь сообщений? - PullRequest
3 голосов
/ 16 августа 2011

У меня есть приложение, использующее MSMQ, которое работает очень хорошо, когда и производитель, и потребитель находятся на одной машине.

Вчера я впервые попытался создать другого производителя, который будет работать наотдельная машина.Очередь является частной, и до этого обе стороны называли ее

string strQueueName = ".\Private$\MyQueue";

. Я пытался ссылаться на эту очередь с удаленной машины несколькими способами.Имя моего сервера - "groucho", поэтому я попытался

string strQueueName = "groucho\Private$\MyQueue";

, но это последовательно вывело исключение "неверный путь к очереди".

Один из разработчиков предложил мне попробовать следующее, что позволяет избежатьисключение:

string strQueueName = "FORMATNAME:DIRECT =OS:grouch\\private$\\SDVQueue";

Это больше не вызывает исключение, но, похоже, оно также не работает, так как я не вижу сообщений в очереди.

Сервер WindowsСервер 2008 R2.Очередь настроена (я только что заметил), чтобы «Все» могли получать и просматривать, но не отправлять, но когда я пытаюсь добавить «Отправить», я получаю диалоговое окно с сообщением об ошибке «Невозможно установить дескриптор безопасности, Ошибка: В доступе отказано".У меня do есть права администратора на этом поле.

Из других сообщений я знаю, что в игру вступают все виды безопасности, но я не вижу ошибок в журналах событий.на отправителе или на хост-компьютере.

Если это проблема безопасности, как я могу узнать, в чем проблема?

Спасибо!

Вот полный тесткод:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Messaging;

namespace RemoteQueue
{
  class Program
  {
    static void Main(string[] args)
    {
      string name = "FORMATNAME:DIRECT =OS:groucho\\private$\\SDVQueue";;
      string input = null;
      MessageQueue queue = null;

      try
      {
        queue = new MessageQueue(name);
        string key = "key";

        for (int i = 0; i < 200; i++)
        {
          Message msgToSend = new Message();
          string value = "value_" + i;

          msgToSend.Body = string.Format("{0},{1}", key, value);

          Console.WriteLine("Sending message " + i);
          queue.Send(msgToSend, "otherpart");
        }

      }
      catch (MessageQueueException me)
      {
        Console.WriteLine("ERROR: caught message queue exception: " + me.Message);
      }

      Console.WriteLine("Type any key to exit...");
      input = Console.ReadLine();

    }
  }
}

Ответы [ 3 ]

4 голосов
/ 16 августа 2011

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

Теперь перейдите на принимающий сервер.

Для того, чтобы установить разрешения для очереди, вы должны стать ее владельцем. В свойствах очереди -> вкладка Безопасность -> Дополнительно -> вкладка Владелец -> Изменить владельца на. Вы должны увидеть своего участника Windows в списке.

Это позволит вам установить права на отправку. После того, как это будет сделано, проверьте исходящие очереди на отправляющем сервере, и сообщение теперь должно быть передано.

Надеюсь, это поможет.

1 голос
/ 24 августа 2011

Добавьте следующее к вашему примеру. Он должен отображаться в очереди недоставленных писем, если он не обрабатывается сервером.

...

queue = new MessageQueue(name);

queue.DefaultPropertiesToSend = new DefaultPropertiesToSend();

queue.DefaultPropertiesToSend.UseDeadLetterQueue = true;

....

0 голосов
/ 12 октября 2012

Может быть проблема безопасности на вашем сервере msmq.

Попробуйте установить «полный контроль всех пользователей» в очереди

...