Azure Service Bus:创建指定会话接收器失败问题求助
Failed to create a receiver for the requested session 'session-1') 问题场景
我们已配置启用会话的Azure Service Bus Topic,发送携带会话ID为session-1的消息,且仅有一个客户端监听此Topic,但使用Azure Service Bus JavaScript SDK创建对应会话接收器时,触发错误:
Failed to create a receiver for the requested session 'session-1'
发送方代码
import { ServiceBusClient } from "@azure/service-bus"; const TOPIC_NAME = "entities-changed"; export const sendToServiceBus = async (message: { [key: string]: any }) => { const serviceBusClient = new ServiceBusClient(process.env.SB_ENDPOINT); const sender = serviceBusClient.createSender(TOPIC_NAME); await sender.sendMessages({ body: message, sessionId: "session-1", }); };
接收方代码
import { ServiceBusClient } from "@azure/service-bus"; const sbClient = new ServiceBusClient(process.env.SB_ENDPOINT); const receiver = await sbClient.acceptSession( RECEIVING_FROM_TOPIC_NAME, RECEIVING_FROM_SUBSCRIPTION_NAME, "session-1" ); // 此处触发错误 const messages = await receiver.receiveMessages(1, { maxWaitTimeInMs: 10000, }); await receiver.completeMessage(messages[0]); await receiver.close(); await sbClient.close();
解决思路
检查订阅的会话启用状态
即使Topic启用了会话,对应的订阅必须同步开启会话支持。如果订阅未启用会话,消息携带的sessionId不会被订阅维护,导致无法通过指定sessionId创建接收器。需在Azure门户或ARM模板中确认目标订阅的Session enabled选项已勾选。验证消息是否投递到目标订阅
通过Azure门户的Service Bus订阅指标(如Active messages)或Service Bus Explorer工具,确认带有session-1的消息已成功到达订阅。若消息未到达,排查发送方的连接字符串权限、Topic名称是否正确,或订阅是否存在过滤规则拦截了消息。确认接收器API参数正确性
检查acceptSession方法的参数顺序和变量值:sbClient.acceptSession(topicName, subscriptionName, sessionId),确保RECEIVING_FROM_TOPIC_NAME和RECEIVING_FROM_SUBSCRIPTION_NAME与实际资源名称完全一致,无拼写错误。排查会话锁定或占用情况
如果之前有客户端接受session-1会话后未正确关闭接收器,会话会处于锁定状态,新的接收器无法创建。可通过Azure门户查看订阅的会话状态,等待锁定自动过期(默认30秒)或手动释放锁定。使用Function App官方推荐的绑定方式
若接收端运行在Azure Function App中,官方不建议手动通过SDK接收,推荐使用Service Bus绑定:
在function.json中配置绑定并开启会话支持,会话由Function Runtime内部管理,无需手动创建接收器。示例配置:{ "type": "serviceBusTrigger", "direction": "in", "name": "mySbMsg", "topicName": "entities-changed", "subscriptionName": "your-subscription-name", "connection": "SB_ENDPOINT", "isSessionsEnabled": true }
内容的提问来源于stack exchange,提问作者tboll

