【问题标题】:Azure sdk ServiceBusTrigger triggers processing of the same message each minuteAzure sdk ServiceBusTrigger 每分钟触发处理同一条消息
【发布时间】:2016-12-25 21:54:58
【问题描述】:

我使用下一个代码设置了 azure webjob:

程序.cs:

public class Program {
    static void Main(){
        JobHostConfiguration config = new JobHostConfiguration();
        config.Tracing.ConsoleLevel = TraceLevel.Verbose;
        config.Queues.BatchSize = 1;
        config.UseTimers();
        config.Queues.MaxDequeueCount = 1;
        config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(3);
        ServiceBusConfiguration sbConfig = new ServiceBusConfiguration();
        sbConfig.MessageOptions = new OnMessageOptions
        {
            MaxConcurrentCalls = 5,
            AutoRenewTimeout = TimeSpan.FromMinutes(10),
            AutoComplete = true
        };

        config.UseServiceBus(sbConfig);
        config.NameResolver = new QueueNameResolver();

        var host = new JobHost(config);
        host.RunAndBlock();
    }

    public class QueueNameResolver : INameResolver
    {
        public string Resolve(string name)
        {
            return ConfigurationManager.AppSettings[name];
        }
    }
}

函数.cs

public static void ProcessQueueMessage([ServiceBusTrigger("%WebjobIncomingQueueName%")] ProcessingInfo processingInfo, TextWriter webjobTextWriter){
    webjobTextWriter.WriteLine("Service Bus trigger started");
    //long running task simulation
    Thread.Sleep(400000);
}

App.config 文件队列名配置部分:

<appSettings>
    <add key="WebjobIncomingQueueName" value="webjob-test" />
</appSettings>

ProcessingInfo 类:

 public class ProcessingInfo {
        public long ID { get; set; }
 }

这里的问题是对于来自webjob-test 队列ProcessQueueMessage 的相同消息在第一次出现后每分钟触发一次。根据答案here,这应该可以使用OnMessageOptions.AutoRenewTimeout 轻松配置,但它似乎不起作用。有人可以帮忙解决这个问题吗?

【问题讨论】:

  • documentation,谈到了 60 秒超时,并描述了如何增加它。这是针对 OnMessageOptions 类的,但我看不出它与 WebJobs 有何关系。
  • @Vova。配置超时后是否仍然每分钟触发相同的消息?我能想到的唯一原因是处理函数花费的时间比超时时间长,因为 SDK 假设消息尚未处理,因此将其添加回队列。是否可以将处理移动到后台线程?

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


【解决方案1】:

当你说的消息被编译后,那么就不会回到队列中了 示例

while ((message = myQueueClient.Receive(new TimeSpan(hours: 0, minutes: 0, seconds: 5))) != null)
{
    Console.WriteLine(string.Format("Message received: {0}, {1}, {2}", message.SequenceNumber, message.Label, message.MessageId));
    message.Complete();

    Console.WriteLine("Processing message (sleeping...)");
    Thread.Sleep(1000);
}

查看link了解更多信息

【讨论】:

    【解决方案2】:

    当消息是有毒的,然后 WebJob SDK 没有删除它时,可能会发生这种情况。

    内容导致功能失败的消息称为毒 消息。函数失败时,队列消息不被删除 并最终再次被拾起,导致循环重复。 SDK可以在有限次数后自动中断循环 迭代次数,或者您可以手动完成。

    见: https://docs.microsoft.com/en-us/azure/app-service-web/websites-dotnet-webjobs-sdk-storage-queues-how-to#a-idpoisona-how-to-handle-poison-messages

    【讨论】:

      猜你喜欢
      • 2019-02-09
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 2019-10-25
      • 2020-08-31
      • 2020-10-15
      相关资源
      最近更新 更多