2010-09-06 2 views
0

Новое в MSMQ ... Моя локальная очередь никогда не получает мое тестовое сообщение. Я проверил, что очереди сообщений и триггеры очереди сообщений запущены в диалоговом окне «Мои сервисы» (Vista Ultimate). Мысли?Закрытая очередь MSMQ - не получает

class ConsoleApplication 
{ 
    private const string Path = @".\private$\SomeQueue"; 

    static void Main(string[] args) 
    { 
     var queue = !MessageQueue.Exists(Path) 
     ? MessageQueue.Create(Path) 
     : new MessageQueue(Path) { Formatter = new BinaryMessageFormatter() }; 

     queue.ReceiveCompleted += queue_ReceiveCompleted; 
     queue.BeginReceive(); 
     queue.Send("test message"); 
     Console.ReadLine(); 
     queue.Close(); 
    } 

    static void queue_ReceiveCompleted(object sender, 
             ReceiveCompletedEventArgs e) 
    { 
     Console.WriteLine("Received message..."); 
     var queue = (MessageQueue)sender; 
     try 
     { 
      var message = queue.EndReceive(e.AsyncResult); 
      Console.WriteLine("Processing message..."); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     finally 
     { 
      queue.BeginReceive(); 
     } 
    } 
} 

EDIT: Просто была мысль, попробуйте удалить и заново создать очередь с MessageQueue.Delete (Path). И это сработало. Наверное, моя очередь была как-то закрыта.

+0

Получить ссылку на новый объект на очередь объекта отправителя var queue = (MessageQueue) отправитель; , а затем используя тот же объект для нового BeginReceive(). огромная ошибка. Помните об исключении переполнения стека, помните об этом – Jsinh

ответ

1

Сомневаюсь, что сама очередь была сломана. Скорее всего, проблема связана с созданием очереди и доступом к ней. MSMQ должен выполнять различные операции, такие как создание файла конфигурации в каталоге LQS, до того как доступ к частной очереди.

0

Вы не можете получить доступ к консоли одновременно. Попробуйте сделать thread.Sleep() и установите логическое значение в вашем обратном вызове. Затем вы можете сделать readline после того, как boolean настроено на чтение вашего вывода.

while (!received) 
{ 
    System.Threading.Thread.Sleep(1000); 
} 
Console.ReadLine(); 

Может быть, вы можете использовать точки останова и Debug.WriteLine() для чтения вывода записывается в визуальный выводе студии окна.

2

попробуйте добавить

queue.ReceiveCompleted += queue_ReceiveCompleted; 

в блоке, наконец static void queue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e) события.

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