如果发生异常,我遇到了一个问题,即webjob会破坏来自服务总线主题的消息。我希望消息留在主题(对于订阅),直到它成功处理。即使这意味着消息落后,它也会被阻止,直到第一条消息成功为止。
我们有一个Web作业,使用触发器处理服务总线主题上的消息,例如:
[Singleton]
public void ProcessQueueMessage([ServiceBusTrigger("%TopicNameEvent%", "%SubscriptionNameEvent%")] BrokeredMessage message, TextWriter log)
{
lock (MsgLock)
{
log.WriteLine($"{DateTime.UtcNow} - Event processing started for Message Id {message.MessageId}.");
var proc = new MessageProcessor();
proc.ProcessBrokeredMessage(message);
log.WriteLine($"{DateTime.UtcNow} - Event processing finished for Message Id {message.MessageId}.");
}
}
在ProcessBrokeredMessage()调用中,我将构造一个像这样抛出的异常:
public void ProcessBrokeredMessage(BrokeredMessage message)
{
try
{
throw new Exception("blah blah blah");
}
catch (Exception ex)
{
_log.Error(ex); // Log what caused exception
throw; // Rethrow in the hopes that the message will stick and not be abandoned ....
}
}
我发现的是,当异常发生时,消息被放弃,然后触发后续消息。它没有重试抛出异常的消息?我对SDK的理解是它应该只在成功时完成消息处理,并且异常会使消息保持活动状态吗?
这就是我们创建Service Bus客户端配置的方式:
_subClient = SubscriptionClient.CreateFromConnectionString(_servicesBusConnectionString, _feedName, _subscriptionName);
_subClient.RetryPolicy = RetryPolicy.Default;
var config = new JobHostConfiguration
{
JobActivator = new NinjectActivator(_ninjectKernel),
NameResolver = new TopicNameResolver()
};
var sbConfig = new ServiceBusConfiguration {ConnectionString = _servicesBusConnectionString};
sbConfig.MessageOptions.MaxConcurrentCalls = 1; // We only want to process one message at a time, in order
config.UseServiceBus(sbConfig);
// block the host process
_host = new JobHost(config);
_host.RunAndBlock();
我确实尝试了一些关于设置Dequeue计数的代码(例如:Queues = {MaxDequeueCount = 100} //尝试100次)但是这也不起作用。
更新:
在处理引发异常的消息之前和之后,DeadLetterMessageCount保持不变。在处理之前是14.处理后仍然是14:
更新#2:
好的,所以我决定在发生异常时将消息ID写入文本文件。看起来 在发生异常时再次尝试该消息。但是不确定它何时发生......下面的粗体ID是相同的,以便在他们再次尝试时显示
1932248 1932324 1932259 1932233 1932308 1932249 1932250 1932240 1932333 1932226 1932231 1932247 1932229 的 1932234 1932334 1932232 1932220 1932259 1932333 1932229 的 1932234 1932220 1932226 1932247 1932248 1932250 1932240 1932233 1932232 1932249 1932324 1932231 1932334 1932259 1932334 1932229 1932333 1932226 1932232 1932247 1932248 1932240 1932249 1932324 的 1932234 1932250 1932424 1932233 1932231 1932333 1932334
更新#3: 好的,我可以确认它最终会在移动到死信队列之前重试该消息10次。
我现在只需要弄清楚如何在发生异常时让Web作业停止处理所有内容,直到相同的消息成功(很可能等待人类修复某些内容,重新部署新代码,修复数据库问题等) )。