如何通过HTTP请求用托管身份认证以Peek Lock模式读取Service Bus主题多条消息
实现步骤
1. 获取Managed Identity访问令牌
首先需要为当前环境的托管身份申请Service Bus资源的访问令牌,作用域固定为https://servicebus.azure.net/.default。
如果是在Azure资源(虚拟机、函数、应用服务等)内部运行,可直接调用实例元数据服务接口获取:
GET http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://servicebus.azure.net/
请求必须携带请求头Metadata: true。如果使用用户分配托管标识,需要在请求参数中额外增加client_id=<用户分配托管标识的客户端ID>。
请求成功后,返回结果中的access_token字段即为后续认证需要的令牌。
2. 调用REST API批量Peek Lock读取消息
使用POST请求调用对应主题订阅的消息接收接口,该请求默认就是Peek Lock模式,消息会被临时锁定,锁定时长为订阅配置的默认锁定时间,最长5分钟。
请求格式
POST https://<服务总线命名空间>.servicebus.windows.net/<主题名>/subscriptions/<订阅名>/messages/head?timeout=60&max-message-count=<要读取的消息数,最大256>
必填请求头
Authorization: Bearer <第一步获取的access_token>Content-Type: application/atom+xml;type=entry;charset=utf-8
响应说明
- 状态码200:返回拉取到的多条消息,每条消息的
BrokerProperties属性中包含MessageId和LockToken,后续处理消息需要用到这两个值 - 状态码204:当前订阅暂无待消费的消息
3. 消息后续操作(可选)
完成消息(处理成功后永久删除)
DELETE https://<服务总线命名空间>.servicebus.windows.net/<主题名>/subscriptions/<订阅名>/messages/<MessageId>/<LockToken>
放弃消息(解锁消息让其他消费者读取)
PUT https://<服务总线命名空间>.servicebus.windows.net/<主题名>/subscriptions/<订阅名>/messages/<MessageId>/<LockToken>
请求需要额外携带头参数x-ms-servicebus-operation: abandon
注意事项
- 单次请求最多拉取256条消息,总消息体大小不能超过1MB
- 访问令牌有效期一般为1小时,过期前需要重新获取避免认证失败
- 超时参数最大可设置为240秒,适合长轮询场景减少空请求次数
内容的提问来源于stack exchange,提问作者Rajat Bajaj
相关产品推荐
相关产品推荐

