【问题标题】:C# - Azure Service Bus - Cancel message processing after a given timeC# - Azure 服务总线 - 在给定时间后取消消息处理
【发布时间】:2018-04-04 08:39:23
【问题描述】:

我正在构建一个基于服务总线的应用程序。当我的receiver从服务总线获取消息时,可能需要很长时间来处理它,所以我想等待处理,但是如果时间太长,应该取消处理,消息应该是完全的。

这是我的接收器的代码:

client.OnMessageAsync(async message =>
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("message from api");
                    try
                    {
                        CancellationTokenSource source = new CancellationTokenSource();
                        source.CancelAfter(TimeSpan.FromSeconds(30));
                        var task = new Task(() => ProcessServiceBusMessage(message).Wait(), source.Token);

                        await message.CompleteAsync();
                    }
                    catch (Exception ex)
                    {
                        errLog.Error(ex.Message + ex.StackTrace);
                        await message.DeadLetterAsync();
                    }
                }, new OnMessageOptions() { AutoComplete = false, MaxConcurrentCalls = 20, AutoRenewTimeout = new TimeSpan(0, 5, 0) });

如您所见,我在任务中启动了我的ProcessServiceBusMessage 函数,我等待它并在 30 秒后使用CancellationToken 取消任务(如果消息需要超过 30 秒才能完成处理),但它不起作用。

我该如何解决?

编辑:具体来说,任务不会在 30 秒后取消,而是立即执行message.CompleteAsync(),无需等待任务

谢谢。

【问题讨论】:

  • 究竟什么“不起作用”?
  • 任务在 30 秒后没有取消,而是立即执行 message.CompleteAsync() 函数。我编辑问题以指定此详细信息
  • 好的,抱歉,但它看起来像是异步的东西,我对此知之甚少。

标签: c# azure azureservicebus cancellation-token


【解决方案1】:

问题是你创建了一个任务但没有等待它,所以CompleteAsync 被立即调用。

这应该是一种更简洁的方法:

var task = ProcessServiceBusMessage(message);
await Task.WhenAny(task, Task.Delay(timeout));
await message.CompleteAsync();

【讨论】:

  • nit:检查task 是否完成,然后才调用message.CompleteAsync。否则可能是超时了,但处理仍在进行中。
  • @SeanFeldman 这是真的,因此如果WhenAny() 调用由于超时而完成,我该如何停止ProcessServiceBusMessage 任务?
  • @AlessioInnocenzi 我会说ProcessServiceBusMessage 应该采取CancellationToken 和我们它。
【解决方案2】:

是否要考虑改用 Azure 存储队列?

默认情况下,一条消息被锁定 30 秒,因此可能存在冲突。在您取消 30 秒之前,服务总线可能会引发 Lock expired 异常

【讨论】:

    猜你喜欢
    • 2020-07-20
    • 2017-11-01
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多