2016-06-28 68 views
1

我已經跟隨了msmq的發佈/訂閱演示,並且在發佈者在訂閱者之前啓動時丟失了消息。 msmq已經被創建。Rebus MSMQ似乎失去了消息

在一個控制檯應用程序,我的出版商代碼

_activator = new BuiltinHandlerActivator(); 

Configure.With(_activator) 
      .Transport(t => t.UseMsmq("PaymentsToTake")) 
      .Subscriptions(s => s.StoreInMemory()) 
      .Start(); 

/* In the timer code */ 
MyDateMessage m = new MyDateMessage() 
     { 
      NowTime = DateTime.Now, 
      Counter = _index 
     }; 

_activator.Bus.Publish(m).Wait(); 
_index++; 

我的用戶代碼在另一個控制檯應用程序

_activator = new BuiltinHandlerActivator(); 

_activator.Register(() => new PrintDateTime()); 


Configure.With(_activator) 
      .Transport(t => t.UseMsmq("PaymentsToTake-Receiver1")) 
      .Routing(r => r.TypeBased().Map<MyDateMessage>("PaymentsToTake")) 
      .Start(); 

_activator.Bus.Subscribe<MyDateMessage>().Wait(); 

結果 當我運行的用戶,我得到的消息發送MyDateMessage - >然後當我運行消費者時,出現的第一條消息是「 53時間是「因此0-52消息丟失了!

+0

嗨閃存,我已經回答了你的問題 - 你可以嘗試,看看它是否修復你的問題?如果是這樣,請將問題標記爲已回答(如果不是,請告訴我,所以我可以幫助您:)) – mookid8000

回答

1

我懷疑這是因爲您正在使用in-mem訂閱存儲空間,這意味着發佈商在之前運行時不記得訂閱誰。

對於大多數(如果不是全部的話)實際情況,您應該爲訂閱選擇某種持久性存儲。它可能是一個像SQL Server這樣的數據庫,或者它甚至可能是一個本地JSON文件。

你只需要更改線路

.Subscriptions(s => s.StoreInMemory()) 

成類似如

.Subscriptions(s => s.UseJsonFile(@"subscriptions.json")) 

你可以試試看看能否解決你的問題? :)

+0

感謝Mookid。在用MSMQ進行進一步測試後,我可能會最終只使用RabitMQ,而不是像「只是工作」那樣。 – Flash

+1

是的 - RabbitMQ能夠做適當的多播,Rebus可以利用它作爲其訂閱存儲。正如你所看到的,這減輕了你持續訂閱的負擔。快樂的消息! :) – mookid8000