You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Service Bus Processor未触发问题:主题有消息却无法接收

问题分析与解决:Azure Service Bus Processor 消息接收异常

问题现象

  • 移除Console.ReadKey();后,Processor无法触发消息接收逻辑
  • 保留Console.ReadKey();时,消息能被接收,但StopProcessingAsync()等后续代码无法执行

原因解析

  1. 移除ReadKey后程序直接退出:await processor.StartProcessingAsync()是非阻塞调用,启动处理器后如果没有后续阻塞逻辑,程序会直接走到await using块末尾,ServiceBusClient被释放,处理器随之停止,自然接收不到消息。
  2. 保留ReadKey时后续代码无法执行:Console.ReadKey()是同步阻塞方法,会一直卡在该行直到用户按键,导致后续的StopProcessingAsync()完全没机会执行。

修正方案

改用异步方式维持程序运行,同时确保清理代码能正常执行,比如借助CancellationTokenSource控制程序生命周期。

修正后的代码示例

var topicName = "nf-channel-topic";
var subscriptionName = "nf-channel-subscription";
var cancellationSource = new CancellationTokenSource();

// 监听控制台退出信号(Ctrl+C)
Console.CancelKeyPress += (sender, e) =>
{
    e.Cancel = true;
    cancellationSource.Cancel();
    Console.WriteLine("正在停止处理器...");
};

// 创建Service Bus客户端
await using (ServiceBusClient client = new ServiceBusClient(configuration.GetSection("AzureString").Value))
{
    // 创建订阅处理器
    ServiceBusProcessor processor = client.CreateProcessor(topicName, subscriptionName, new ServiceBusProcessorOptions());

    // 注册消息处理逻辑
    processor.ProcessMessageAsync += async processMessageEventArgs =>
    {
        string body = processMessageEventArgs.Message.Body.ToString();
        SBusMessageRequest mySbMsg = JsonSerializer.Deserialize<SBusMessageRequest>(body);
        
        // 此处添加你的业务处理逻辑
        Console.WriteLine($"Received message: {body}");

        // 标记消息为已处理
        await processMessageEventArgs.CompleteMessageAsync(processMessageEventArgs.Message);
    };

    // 注册错误处理逻辑
    processor.ProcessErrorAsync += args =>
    {
        Console.WriteLine($"消息处理出错: {args.Exception.ToString()}");
        return Task.CompletedTask;
    };

    // 启动消息处理
    await processor.StartProcessingAsync(cancellationSource.Token);

    Console.WriteLine("处理器已启动,按Ctrl+C停止...");
    
    // 异步阻塞等待取消信号,不阻塞后续代码执行
    await Task.Delay(Timeout.Infinite, cancellationSource.Token);

    // 停止处理器
    await processor.StopProcessingAsync();
    Console.WriteLine("处理器已停止");
}

关键改进点

  • 用CancellationTokenSource替代同步ReadKey,响应控制台退出信号,实现优雅启停
  • 通过await Task.Delay(Timeout.Infinite, cancellationSource.Token)实现异步阻塞,既维持程序运行,又能在收到取消信号后继续执行清理代码
  • 确保ServiceBusClient在await using块内被正确管理,处理器在客户端释放前完成停止

内容的提问来源于stack exchange,提问作者Hemanth Reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 19:05:03