我使用msmq跟踪了pub / sub演示,并且在发布者在订阅者之前启动时丢失了消息。 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 - &gt;然后当我运行消费者时,出现的第一条消息是“53时间到了”因此消息0-52丢失了!
答案 0 :(得分:1)
我怀疑这是因为你正在使用 in-mem订阅存储,这意味着发布者不记得谁在以前运行时订阅了。
对于大多数(如果不是全部)真实场景,您应该为订阅选择某种持久性存储。它可以是像SQL Server这样的数据库,也可以是本地JSON文件。
您只需更改行
即可.Subscriptions(s => s.StoreInMemory())
等等。
.Subscriptions(s => s.UseJsonFile(@"subscriptions.json"))
你可以尝试看看是否能解决你的问题吗? :)