当前位置: 首页 > 知识库问答 >
问题:

WebJobs不重试失败的队列消息

拓拔骁
2023-03-14

我在使用新的0.3.0-beta版WebJobs SDK的WebJob中有以下逻辑。当我的代码处理消息失败时,Azure仪表板将显示聚合异常(这是有意义的,因为这是异步的)。但是,它不会重试处理消息。

我能找到的非常小的留档表明消息应该在失败后10分钟内重试。新的SDK不是这样吗?

public static Task ProcessMyMessageAsync(
    [QueueTrigger(Config.MY_QUEUE)] string msg, 
    int dequeueCount, 
    CancellationToken cancellationToken)
{
    var processor = Config.Container.GetInstance<IMessageProcessor>();
    return processor.HandleJobAsync(msg, dequeueCount, cancellationToken);
}

我得到的异常源于SQL超时异常(在我的代码中是针对SQL Azure的db查询):

System.AggregateException: System.AggregateException: One or more errors occurred. 
    ---> System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing  the command definition. See the inner exception for details. 
        ---> System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding. 
        ---> System.ComponentModel.Win32Exception: The wait operation timed out

共有1个答案

单凯捷
2023-03-14

您应该设置MaxDequeueCount。

JobHostConfiguration jobHostConf = new JobHostConfiguration();
jobHostConf.Queues.MaxDequeueCount = 10;
var host = new JobHost(jobHostConf);
host.RunAndBlock();

这将重试10次,在消息被放入死/坏信件队列之前。

还可以在函数中使用自定义重试策略。我建议你看看瞬态故障处理应用程序块https://msdn.microsoft.com/en-us/library/hh680934(v=pandp.50). aspx

或者您可以在EF中启用重试,使用SqlAzureExecttionStrategyhttps://msdn.microsoft.com/en-us/data/dn456835.aspx

 类似资料:
  • 我有一个Azure WebJob函数,用于侦听Azure ServiceBus队列上的消息。通常,当我在代码中遇到异常时,会根据Azure WebJobs SDK文档放弃该消息: SDK在PeekLock模式下接收消息,如果函数成功完成,则调用消息完成,如果函数失败,则调用放弃。如果函数运行时间超过PeekLock超时时间,锁将自动更新。 根据Azure ServiceBus文档,这意味着该消息将

  • 本文向大家介绍azure-webjobs 队列触发器,包括了azure-webjobs 队列触发器的使用技巧和注意事项,需要的朋友参考一下 示例 一个简单的示例,定义一个由队列消息触发的功能: 它还支持POCO序列化:            

  • 我的处理来自的消息。周期性地,按摩无法处理,消费者抛出异常。不管怎样,消费者还是会做出补偿。在Kafka中,我能区分成功消息和失败消息吗?我想,我不能。这是真的吗?如果这是真的,我有一个主要问题: 如何重试失败消息?我知道一些方法,但我不确定它们是否正确。 1) 将“偏移”更改为“提前”。但通过这种方式,成功消息也会重试。 2) 当我捕捉到异常时,我会将此消息发送到另一个主题(例如错误主题)。但这

  • 我使用rabbitMQ作为代理,在spring中配置了生产者/消费者应用程序(配置如下所述)。当消费者机器出现故障时,我面临重新连接消费者的问题,消费者应用程序通常会在一段时间内恢复,但代理(队列)和消费者之间的连接没有重新建立, 我在rabbit-MQ管理控制台中进行了验证,发现队列中没有列出任何消费者,尽管消费者在一段时间后已经自动恢复。 任何关于如何解决这个问题的见解,请让我知道,如果需要任

  • 我正在使用带有ActiveMQ的JMS。我在一台服务器上运行ActiveMQ代理,它创建一个队列和一个消息使用者,用于接收来自其他服务器的消息。如果另一个服务器试图向队列发送消息,但由于某种原因失败(比如服务器之间的网络中断),那么我不希望该服务器重试发送消息。只发送一次,如果失败,不要重试。这在ActiveMQ/JMS中可能吗?javax.JMS.session类有3种确认模式(auto_ack

  • 你知道这里发生了什么吗?可以恢复消息和队列吗?如何使用ActiveMQ Artemis数据?所有队列/消息都丢失了。只有dlq/expiryqueue。 我们必须更改配置。所以我们开始更新从机。 为了将故障转移到从服务器以修复主服务器,我们执行了@16:32 在Master上有一些警告,但不多。 在从服务器上,我们可以看到一些超时和连接失败。不确定Slave是否接管了队列并且工作正常。 @16:4