1

我有一个配置为处理命令对象的服务。在 Handle 方法中,我在特定的业务案例中抛出异常。发生这种情况时,它将错误发送到错误队列,我认为特定管理服务正在处理错误队列。我的理解是,Particular Management 服务会监控错误队列并处理消息,也就是说,挖掘元数据并将其持久化到 RavenDB。最后,它应该将消息转发到 Error.Log 队列。遗憾的是,每条消息似乎都被路由到了 Service.Management.Errors 队列。大概是因为特定管理服务处理程序失败了。

如果我查看 Service.Management.Errors 队列中消息的扩展标头,我会看到以下信息:

<HeaderInfo>
<Key>NServiceBus.ExceptionInfo.ExceptionType</Key>
<Value>System.NullReferenceException</Value>
</HeaderInfo>

<HeaderInfo>
<Key>NServiceBus.ExceptionInfo.Message</Key>
<Value>Object reference not set to an instance of an object.</Value>
</HeaderInfo>

<HeaderInfo>
<Key>NServiceBus.ExceptionInfo.Source</Key>
<Value>NServiceBus.Core</Value>
</HeaderInfo>

<HeaderInfo>
<Key>NServiceBus.ExceptionInfo.StackTrace</Key>
<Value>System.NullReferenceException: Object reference not set to an instance of an object.
             at NServiceBus.Unicast.Transport.TransportReceiver.ProcessMessage              (TransportMessage       message) in c:\TeamCity\buildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Unicast\Transport\TransportReceiver.cs:line 357

在 c:\TeamCity\buildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Unicast\Transport\TransportReceiver.cs:NServiceBus.Transports.Msmq.MsmqDequeueStrategy 中的 NServiceBus.Unicast.Transport.TransportReceiver.TryProcess(TransportMessage 消息) 处.Action() 在 c:\TeamCity\buildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqDequeueStrategy.cs:line 170

由于 ServiceInsight 特定管理服务在本质上应该是通用的,因此我假设它不需要了解消息的实际类型。意思是,我不必将我的 Message dll 扔到服务目录中(对吗?)。这意味着它只是通过简单地读取扩展头来挖掘所有数据以持久保存到 RavenDB。

因此,有了基础工作。有人可以验证或无效我对 ServiceInsight 如何工作和配置的理解。其次,我的错误看起来像是 NServiceBus.Core 中的错误。我应该添加一些DLL或其他东西。是否还有另一个可能导致我忽略的问题的候选人。

4

1 回答 1

0

我们遇到了类似的问题,虽然我们的问题可能对我们来说非常具体,但我会分享它以防万一。

我们的大多数服务都使用带有 XML 序列化的 NServiceBus 4.0.3,但我们有一个使用 NSB 3.3.1 和二进制序列化的旧服务。该服务正在记录到审核队列,当特定管理服务尝试读取这些消息时,它会失败。我不确定错误的根源是什么,因为 NSB重新抛出异常并丢失了原始堆栈跟踪。我怀疑它正在尝试读取不存在的标题。也可能是由于使用了二进制序列化。

我们的解决方案是关闭对该一项较旧服务的审核。

于 2014-02-12T15:00:15.743 回答