Service Bus Processor未触发问题:主题有消息却无法接收
问题分析与解决:Azure Service Bus Processor 消息接收异常
问题现象
- 移除
Console.ReadKey();后,Processor无法触发消息接收逻辑 - 保留
Console.ReadKey();时,消息能被接收,但StopProcessingAsync()等后续代码无法执行
原因解析
- 移除ReadKey后程序直接退出:
await processor.StartProcessingAsync()是非阻塞调用,启动处理器后如果没有后续阻塞逻辑,程序会直接走到await using块末尾,ServiceBusClient被释放,处理器随之停止,自然接收不到消息。 - 保留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
相关产品推荐
相关产品推荐

