繁体   English   中英

C#-Azure Service Bus-在给定时间后取消消息处理

[英]C# - Azure Service Bus - Cancel message processing after a given time

我正在构建基于服务总线的应用程序。 当我的接收者从服务总线上收到消息时,可能需要花费很多时间来处理它,因此我想等待处理,但是如果花费的时间太多,则应取消该处理,并应将消息删除。完成。

这是我的接收者的代码:

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) });

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

我该如何解决?

编辑:特别是该任务不会在30秒后取消,并且会立即执行message.CompleteAsync() ,而无需等待任务

谢谢。

问题是您创建了一个任务,但不等待它,因此会立即调用CompleteAsync

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

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

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

默认情况下,邮件被锁定30秒,因此可能存在冲突。 您的30秒取消发生之前,服务总线可能会抛出“锁定过期”异常

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM