我完全不知道为什么遇到这个问题。我是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/5977和Anyone using Ninject 2.0 as the nServiceBus ObjectBuilder? - 但我没有取得任何成功让我的问题消失
我最有责任寻求任何帮助。我是NServiceBus的n00b!
答案 0 :(得分:4)
NServiceBus默认不处理多次,如果发生异常,它会重试5次,你可以在配置文件中设置它。你有没有开启分布式交易?因为您提交到数据库并且在打开另一个事务时有一个打开的事务(队列事务),它会尝试将其升级到分布式事务,我认为这可能是问题所在。你有控制台应用程序运行?你应该看到一些外观。
答案 1 :(得分:1)
我建议在try / catch中包装Handle方法的主体,并在catch中添加一个断点,看看有什么问题。 完成后,删除try / catch。