ServiceBusTrigger没有重试放弃的邮件?

时间:2017-10-20 05:22:56

标签: c# azure azure-webjobs servicebus azure-webjobssdk

如果发生异常,我遇到了一个问题,即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:

enter image description here

更新#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作业停止处理所有内容,直到相同的消息成功(很可能等待人类修复某些内容,重新部署新代码,修复数据库问题等) )。

0 个答案:

没有答案