使用MsmqSubscriptionStorage时,NServiceBus 2.0会丢失第一条已发布的消息

使用MsmqSubscriptionStorage时,NServiceBus 2.0会丢失第一条已发布的消息,nservicebus,Nservicebus,我在发布/订阅场景中使用MsmqSubscriptionStorage,当订阅尚未存储时,第一条消息将丢失。如果在GenericHost中运行时查看调试消息,我会看到所有订阅都已设置,但第一条消息从未发送给订阅服务器。如果发送了更多消息,则会将它们成功发送到订阅者(如日志中所示) 我使用的是2.0.0.0版 这是我正在使用的总线配置 var bus = Configure.With( new List<Assembly> { typeof(Config

我在发布/订阅场景中使用MsmqSubscriptionStorage,当订阅尚未存储时,第一条消息将丢失。如果在GenericHost中运行时查看调试消息,我会看到所有订阅都已设置,但第一条消息从未发送给订阅服务器。如果发送了更多消息,则会将它们成功发送到订阅者(如日志中所示)

我使用的是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();
var-bus=Configure.With(
新名单
{
typeof(Configure).Assembly,
类型(IBus).组件
})
.DefaultBuilder()
.Log4Net()
.XmlSerializer()
.MsmqTransport()
.IsTransaction(真)
.PurgeOnStartup(错误)
.UnicastBus()
.ImpersonateSender(错误)
.LoadMessageHandlers()
.MsmqSubscriptionStorage()
.CreateBus()
.Start();

如果在注册任何订阅之前发布,这些消息将没有目的地,将被忽略。您可能希望查看DB订阅存储,以减少暂时性。

我在回答我自己的帖子,因此没有人看到这个问题,并得出结论,NServiceBus有问题。这是我的一个GCE(严重的概念错误)。我的宿主环境延迟了对总线的静态引用的解析。更改进程的初始化以在启动时设置静态总线引用可以解决此问题。

看起来您只是告诉NServiceBus扫描其自己的DLL(基于通过()传递给的程序集)-这可能不是最好的主意。在我的示例中,我用消息def忽略了对程序集的引用。我这样做的原因是文件夹包含许多非.NET程序集,我必须有一个巨大的排除列表。如果我只列出我的程序集,我会得到:“类型NServiceBus.Unicast.Transport.CompletionMessage未在序列化程序中注册。”我认为你是对的,它可能与此用法有关,我正在尝试确认它。是的,我看到过这种情况,但事实并非如此。订阅服务器在总线之前运行。调用Publish。我不太明白为什么MsmqSubscriptionStorage会比DB订阅存储更短暂。听起来不错,看起来你有上面的线索。至于存储,这完全取决于您如何设置MSMQ。DB的好处在于它可以很容易地进行集群和复制(特别是在站点之间)。