2011-06-23 66 views
0

我在发布/订阅方案中使用MsmqSubscriptionStorage,并且在订阅尚未存储时第一条消息丢失。如果我在GenericHost中运行时看到调试消息,则会看到所有订阅都已设置,但第一条消息永远不会发送给订阅者。如果发送更多消息,则它们被成功发送给订阅者(如日志中所示)当使用MsmqSubscriptionStorage时,NServiceBus 2.0丢失首次发布的消息

我正在使用版本2.0.0.0。

这是我使用的总线配置。

var bus = Configure.With(
    new List<Assembly> 
    { 
     typeof(Configure).Assembly, 
     typeof(IBus).Assembly 
    }) 
    .DefaultBuilder() 
    .Log4Net() 
    .XmlSerializer() 
    .MsmqTransport() 
     .IsTransactional(true) 
     .PurgeOnStartup(false) 
    .UnicastBus() 
     .ImpersonateSender(false) 
     .LoadMessageHandlers() 
    .MsmqSubscriptionStorage() 
    .CreateBus() 
    .Start(); 
+0

看起来你只是告诉NServiceBus扫描它自己的DLL(基于传递给With()的程序集) - 这可能不是最好的主意。 –

+0

在我的示例中,我忽略了对我的消息def的引用。我这样做的原因是该文件夹包含许多非.NET程序集,我将不得不拥有大量的排除项。如果我只列出我的程序集,我会得到:“类型NServiceBus.Unicast.Transport.CompletionMessage未在序列化程序中注册。”我认为你是对的,它可能与这种用法有关,并试图现在确认它。 –

回答

1

我回答我自己的帖子,所以没有人看到这个问题,并得出结论,NServiceBus有问题。这是我的一个GCE - (毛概念错误)。我的托管环境推迟解决对总线的静态引用。更改我的过程的初始化以在启动时设置静态总线参考解决问题。

0

如果您在任何订阅被注册之前发布,那么这些消息将没有目的地并且将被忽略。您可能希望查看数据库订阅存储以减少瞬态事件。

+0

是的,我见过这种情况,但情况并非如此。订阅者在Bus.Publish被调用之前正在运行。我不太明白为什么MsmqSubscriptionStorage比DB订阅存储更短暂。 –

+0

听起来不错,看起来像你从上面领先。至于存储,这一切都取决于你如何设置MSMQ。关于数据库的好处是它可以很容易地集群和复制(特别是在站点之间)。 –