2016-06-28 88 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