c# - 当我处于 ReceiveAndDelete 模式时,是否需要调用 CompleteMessageAsync?

标签 c# azure azureservicebus azure-servicebus-queues

我有以下 Azure 服务总线代码:

private async Task startInternalAsync(CancellationToken cancellationToken) {
    await using var client = new ServiceBusClient(_connectionString);
    try {
        var processor = client.CreateProcessor(_queueName, new ServiceBusProcessorOptions {
            ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete,
            PrefetchCount = 100
        });

        processor.ProcessMessageAsync += messageHandler;
        processor.ProcessErrorAsync += errorHandler;

        await processor.StartProcessingAsync(cancellationToken);
        await cancellationToken.WhenCanceled();

        _logger.LogDebug("Cancellation requested.  Stopping the receiver...");
        await processor.StopProcessingAsync();
        _logger.LogDebug("Stopped receiving messages.");
    }
    catch (TaskCanceledException) {
        _logger.LogDebug("Cancellation requested.  Exiting.");
    }
    catch (Exception ex) {
        _logger.LogError("Message processing exception.  Exiting.", ex.Message);
    }
}

private async Task messageHandler(ProcessMessageEventArgs args) {
    string body = args.Message.Body.ToString();
    _logger.LogDebug($"Received msg: {body}");

    // complete the message. message is deleted from the queue.
    await args.CompleteMessageAsync(args.Message);
}

private async Task errorHandler(ProcessErrorEventArgs args) {
    await Task.Yield();
    _logger.LogError(args.Exception.ToString());
}

我真的需要在 messageHandler 中调用 await args.CompleteMessageAsync(args.Message) 吗?我处于 ReceiveAndDelete 模式,因此在检索时应立即从 ASB 队列中删除消息,但仍需要 CompleteMessageAsync() 才能将其从本地队列中删除?或者我可以删除该调用吗?

最佳答案

您无需调用CompleteMessageAsync,因为消息一旦发送就会自动删除。

事实上,我记得在 ReceiveAndDelete 模式下获取消息时,调用此方法实际上会引发错误。

关于c# - 当我处于 ReceiveAndDelete 模式时,是否需要调用 CompleteMessageAsync?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67333684/

相关文章:

c# - 在 .NET Core 中使用 System.IO.Enumeration 自定义目录枚举

c# - 使用 .NET 4.6 验证 xml 时出现 NullReferenceException

azure - 无法在同一 ARM 模板部署中创建和引用 keyvault secret

azure - dask:从 Azure blob 读取 Parquet - AzureHttpError

c# - MVVM设计模式问题

c# - 自定义 ASP.NET MVC ActionFilterAttribute - 永远不会调用 Hook

c# - 如何使用 config.json 为 Visual Studio 2015/DNX 项目设置特定于环境的变量?

azure - 放弃 Azure SB 消息以便它在将来以我可以控制的方式再次可见的正确方法是什么?

ssl - Rebus:无法使用装饰器深度 0 解析 Rebus.Bus.IBus - 注册:Rebus.Injection.Injectionist+Handler”

azure - 事件总线和大数据最佳实践