NServiceBus:多次处理消息

时间:2011-03-28 15:20:32

标签: castle-windsor nservicebus

我完全不知道为什么遇到这个问题。我是NServiceBus的新手,到目前为止已经建立了一个简单的“服务器”,用于监听Web应用程序发送的消息。服务器请求自定义初始化(IWantCustomInitialization)并使用custom builder for Castle Windsor 2.5.1。这个自定义构建器基本上是NServiceBus源代码附带的一个副本,只有两个小的更改,以摆脱Windsor 2.5中不赞成使用的方法。

请注意,我的代码与NServiceBus共享容器实例。

我遇到的问题是Web应用程序发送的每条消息都由服务器处理五(5)次。每次尝试都有五个条目,第五次尝试如下:

2011-03-28 16:04:10,326 [Worker.8] DEBUG NServiceBus.Unicast.UnicastBus [] - Calling 'HandleEndMessage' on NServiceBus.SagaPersisters.NHibernate.NHibernateMessageModule
2011-03-28 16:04:10,327 [Worker.8] DEBUG NServiceBus.Unicast.UnicastBus [] - Calling 'HandleEndMessage' on Server.NHibernateSessionMessageModule
2011-03-28 16:04:10,341 [Worker.8] DEBUG NServiceBus.Unicast.UnicastBus [] - Calling 'HandleError' on NServiceBus.SagaPersisters.NHibernate.NHibernateMessageModule
2011-03-28 16:04:10,342 [Worker.8] DEBUG NServiceBus.Unicast.UnicastBus [] - Calling 'HandleError' on Server.NHibernateSessionMessageModule
2011-03-28 16:04:10,344 [Worker.8] ERROR NServiceBus.Unicast.Transport.Msmq.MsmqTransport [] - Message has failed the maximum number of times allowed, ID=80cffd98-a5bd-43e0-a482-a2d96ca42b22\20677.

我有没有指示消息失败的原因,我不知道在哪里挖掘更多信息/输出。

配置'端点'如下所示:

public void Init()
{
    container = Windsor.Container;
    NServiceBus.Configure.With().CastleWindsor251Builder(container).XmlSerializer().MsmqTransport().IsolationLevel(System.Transactions.IsolationLevel.Unspecified);

    var masterInstaller = new NotificationServerInstaller();
    masterInstaller.Install(container, null);
}

在这个阶段,消息处理程序非常有用,看起来像这样:

public class NewUserMessageHandler : IHandleMessages<NotifyNewUserMessage>
{
    private readonly IGetUserQuery _getUserQuery;

    public NewUserMessageHandler(IGetUserQuery getUserQuery)
    {
        _getUserQuery = getUserQuery;
    }

    public void Handle(NotifyNewUserMessage message)
    {
        var result = _getUserQuery.Invoke(new GetUserRequest { Id = new Guid("C10D0684-D25F-4E5E-A347-16F85DB7BFBF") });
        Console.WriteLine("New message received: {0}", message.UserSystemId);
    }
}

如果处理程序方法中的第一行被注释掉,则只处理一次消息。

我在网上发现了一些帖子/主题(包括StackOverflow),讨论类似问题,特别是http://tech.groups.yahoo.com/group/nservicebus/message/5977Anyone using Ninject 2.0 as the nServiceBus ObjectBuilder? - 但我没有取得任何成功让我的问题消失

我最有责任寻求任何帮助。我是NServiceBus的n00b!

2 个答案:

答案 0 :(得分:4)

NServiceBus默认不处理多次,如果发生异常,它会重试5次,你可以在配置文件中设置它。你有没有开启分布式交易?因为您提交到数据库并且在打开另一个事务时有一个打开的事务(队列事务),它会尝试将其升级到分布式事务,我认为这可能是问题所在。你有控制台应用程序运行?你应该看到一些外观。

答案 1 :(得分:1)

我建议在try / catch中包装Handle方法的主体,并在catch中添加一个断点,看看有什么问题。 完成后,删除try / catch。