如何调试Handle
以下两种方法?
我Handle
在 Visual Studio 中的这两种方法上都设置了断点,并将消息发送到Subscriber1
队列,但这两种方法都不会在 VS 下调用。
public class SomeHandler : IHandleMessages<string>, IHandleMessages<IFailed<string>>
{
readonly IBus _bus;
public SomeHandle(IBus bus)
{
_bus = bus;
}
public async Task Handle(string message)
{
// do stuff that can fail here...
}
public async Task Handle(IFailed<string> failedMessage)
{
await _bus.Advanced.TransportMessage.Defer(TimeSpan.FromSeconds(30));
}
}
下面是发送给 的消息Subscriber1
。
我尝试发送不包括rbs2-msg-id
or的消息rbs2-msg-type
,它们都不会触发上述Handle
方法。
{
"body": "Test",
//other fields
"properties": {
"rbs2-intent": "pub",
"rbs2-msg-id": "cd57d735-3989-45b5-8a3c-e457fa61dc94",
"rbs2-return-address": "publisher",
"rbs2-senttime": "2019-05-27T15:07:25.1770000+01:00",
"rbs2-sender-address": "publisher",
"rbs2-msg-type": "System.String, mscorlib",
"rbs2-corr-id": "cd57d735-3989-45b5-8a3c-e457fa61dc94",
"rbs2-corr-seq": "0",
"rbs2-content-type": "application/json;charset=utf-8"
},
//other fields
}
更新 1
如果在 中引发异常Handle(string message)
,则将根据第一级尝试计数重试该方法。这就是我们所需要的。
但是,Handle(IFailed<string> failedMessage)
不调用,如何Handle(IFailed<string> failedMessage)
像abvoe一样调试?
一个注意事项:当在 中抛出异常时Handle(string message)
,不会调用 IErrorHandler,也不会调用 AddTransportMessageForwarder,这些是否正确?
你能试着检查一下你的日志吗?
当您删除rbs2-msg-id
标头时,Rebus 会立即将消息移动到死信队列,只是拒绝处理它。这是因为 Rebus 的错误跟踪器无法跟踪没有消息 ID 的消息。
如果删除rms2-msg-type
标头,序列化程序很可能会抛出错误并且不会反序列化传入的消息。
在这两种情况下,错误都会输出到记录器。
在这两种情况下,消息正文(string
在这种情况下,但它可以是任何消息类型) cannot be constructed from the incoming
byte[] , so Rebus cannot dispatch the message as either
string not
IFailed`。
更新 1后编辑:
如果您的第二级重试没有启动,很可能是因为您尚未启用它们:
Configure.With(...)
.(...)
.Options(o => o.SimpleRetryStrategy(secondLevelRetriesEnabled: true))
.Start();
IErrorHandler
当需要将消息移动到死信队列时调用。当所有传递尝试都失败时(5 次正常传递尝试 + 5 次二级传递尝试),您应该会看到它被调用。
如果您按照我建议的方式进行了配置,AddTransportMessageForwarder
则会在另一个总线实例中使用,该实例从error
队列接收消息。当IErrorHandler
已被调用,并且失败的error
消息已转发到队列时,则应调用您的传输消息转发器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句