2012-05-29 1 views
3

Я установил простой тест, включающий издателя с двумя подписчиками, все из которых работают на одной машине с использованием MSMQ и MassTransit (2.1.1) RuntimeServices, которая использует локальную базу данных Sql Server.MassTransit MSMQ Pub с мульти-sub. Когда RuntimeServices готов?

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

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

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

Мой вопрос в том, что; Есть ли способ узнать, готов ли RuntimeServices к подписчикам уже в своей базе данных при запуске издателя?

Это код издателя

Bus.Initialize(sbc => 
     { 
      sbc.SetCreateTransactionalQueues(true); 
      sbc.ReceiveFrom("msmq://localhost/andy_publisher"); 
      sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions"); 
      sbc.UseMsmq(); 
      sbc.VerifyMsmqConfiguration(); 
     }); 

     var bus = Bus.Instance; 


     Thread.Sleep(5000); // this makes it all work :) 

     int i = 0; 
     foreach (string filename in System.IO.Directory.EnumerateFiles(@"C:\Users\andy.baker\Pictures\", "*.*", SearchOption.AllDirectories)) 
     { 
      Console.WriteLine(filename); 
      bus.Publish(new Messages.FileRegistered {FilePath = filename}); 
      i++; 
     } 

     Console.WriteLine("Published {0} messages", i); 
     Console.ReadLine(); 

Абоненты сконфигурированы так;

Bus.Initialize(sbc => { 
        sbc.UseMsmq(); 
        sbc.VerifyMsmqConfiguration(); 
        sbc.ReceiveFrom("msmq://localhost/andy_subscriber1"); 
           sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions"); 
          } 
      ); 

... и второй абонент ...

Bus.Initialize(sbc => 
     { 
      sbc.UseMsmq(); 
      sbc.VerifyMsmqConfiguration(); 
      sbc.ReceiveFrom("msmq://localhost/andy_subscriber2"); 
      sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions"); 
     } 

Заранее спасибо за любые советы.

ответ