2012-05-29 30 views
3

我已經設置了一個簡單的測試,包括一個有兩個訂閱者的發佈者,所有這些都使用MSMQ和使用本地Sql Server數據庫的MassTransit(2.1.1)RuntimeServices運行。MassTransit MSMQ Pub with multi-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"); 
     } 

先感謝您的任何意見。

回答

相關問題