Microsoft Azure Service Bus Python客户端库
项目描述
Azure Service Bus Python客户端库
Azure Service Bus是一个高性能的云托管消息服务,用于在分布式发送者和接收者之间提供实时和容错通信。
服务总线提供多种机制来实现异步高可靠性通信,例如结构化先进先出消息、发布/订阅功能以及随着需求增长轻松扩展的能力。
使用Service Bus客户端库来实现应用程序和服务之间的通信并实现异步消息模式。
- 创建服务总线命名空间、队列、主题和订阅,并修改它们的设置。
- 在您的服务总线通道中发送和接收消息。
- 利用消息锁定、会话和死信功能来实现复杂消息模式。
源代码 | 包(PyPi) | 包(Conda) | API参考文档 | 产品文档 | 示例 | 更新日志
注意:如果您正在使用0.50版或更低版本,并希望迁移到此包的最新版本,请参阅我们的迁移指南,以从Service Bus V0.50迁移到Service Bus V7。
入门指南
安装包
使用pip安装Azure Service Bus客户端库
pip install azure-servicebus
先决条件
要使用此包,您必须具备
如果您需要Azure服务总线命名空间,您可以通过Azure门户创建它。如果您不想使用图形门户UI,您可以通过Cloud Shell或本地运行Azure CLI,使用以下Azure CLI命令创建它
az servicebus namespace create --resource-group <resource-group-name> --name <servicebus-namespace-name> --location <servicebus-namespace-location>
认证客户端
与服务总线的交互从ServiceBusClient
类的实例开始。您需要具有带有SAS密钥的连接字符串
或命名空间
以及其账户密钥
之一来实例化客户端对象。以下链接中的示例演示了如何通过两种方法进行认证。
从连接字符串创建客户端
- 要获取所需的凭据,可以在链接示例的顶部找到的Azure CLI片段(为Bash Shell格式化)中,将环境变量填充为服务总线连接字符串(您也可以通过遵循获取服务总线连接字符串的逐步指南在Azure门户中找到这些值)。
使用azure-identity库创建客户端:
- 此构造函数接受您的Service Bus实例的完全限定命名空间以及实现了TokenCredential协议的凭据。在azure-identity包中提供了对TokenCredential协议的实现。完全限定命名空间的格式为
<yournamespace.servicebus.windows.net>
。 - 要使用
azure-identity
提供的凭据类型,请安装以下包:pip install azure-identity
- 此外,要使用异步API,您必须首先安装一个异步传输,例如
aiohttp
:pip install aiohttp
- 当使用Azure Active Directory时,您的主体必须分配一个允许访问服务总线的角色,例如Azure服务总线数据所有者角色。有关使用Azure Active Directory授权与Service Bus的更多信息,请参阅相关文档。
注意:客户端可以不使用上下文管理器进行初始化,但必须通过client.close()手动关闭以避免资源泄露。
关键概念
初始化 ServiceBusClient
之后,您可以与 Service Bus 命名空间中的主要资源类型进行交互,其中可能存在多个命名空间,实际的消息传输在这些命名空间中发生,命名空间通常充当应用程序容器。
-
队列:允许发送和接收消息。通常用于点对点通信。
-
主题:与队列相比,主题更适合发布/订阅场景。主题可以被发送消息,但需要订阅,可以并行存在多个订阅以接收消息。
-
订阅:从主题接收消息的机制。每个订阅都是独立的,并接收发送到主题的每条消息的副本。可以使用规则和过滤器来定制特定订阅接收哪些消息。
有关这些资源的更多信息,请参阅 什么是 Azure Service Bus?。
要与这些资源交互,应熟悉以下 SDK 概念
-
ServiceBusClient:用户首先应初始化此对象以连接到 Service Bus 命名空间。要与队列、主题或订阅交互,将从该客户端派生发送器或接收器。
-
ServiceBusSender:要向队列或主题发送消息,您将使用
ServiceBusClient
实例的相应get_queue_sender
或get_topic_sender
方法,如 这里 所见。 -
ServiceBusReceiver:要从队列或订阅接收消息,您将使用
ServiceBusClient
实例的相应get_queue_receiver
或get_subscription_receiver
方法,如 这里 所见。 -
ServiceBusMessage:在发送时,这是您将构建以包含有效载荷的类型。在接收时,这是您将访问有效载荷的地方。
线程安全
我们不保证 ServiceBusClient、ServiceBusSender 和 ServiceBusReceiver 是线程安全的。我们不推荐在多个线程之间重用这些实例。应用程序的运行方式必须使用线程安全的方式来使用这些类。
示例
以下部分提供了一些代码片段,涵盖了一些最常见的服务总线任务,包括
要执行创建和删除队列/主题/订阅等管理任务,请使用可在此处找到的 azure-mgmt-servicebus 库:这里。
请在此处的 示例 目录中找到更多示例,展示常见的 Service Bus 场景,如发送、接收、会话管理和消息处理。
向队列发送消息
注意:请参阅此处参考文档 这里。
此示例向一个已存在的队列发送单条消息和消息数组,该队列通过Azure门户或az命令创建。
from azure.servicebus import ServiceBusClient, ServiceBusMessage
from azure.identity import DefaultAzureCredential
import os
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
credential = DefaultAzureCredential()
with ServiceBusClient(fully_qualified_namespace, credential) as client:
with client.get_queue_sender(queue_name) as sender:
# Sending a single message
single_message = ServiceBusMessage("Single message")
sender.send_messages(single_message)
# Sending a list of messages
messages = [ServiceBusMessage("First message"), ServiceBusMessage("Second message")]
sender.send_messages(messages)
注意:可以使用
ServiceBusSender.schedule_messages()
方法或通过在调用ServiceBusSender.send_messages()
之前指定ServiceBusMessage.scheduled_enqueue_time_utc
来安排消息的延迟投递。
有关安排和取消安排的更多详细信息,请参阅以下示例:这里。
从队列接收消息
要从队列接收消息,您可以通过receiver.receive_messages()
进行临时接收,或通过接收器本身进行持久接收。
通过迭代ServiceBusReceiver从队列接收消息
from azure.servicebus import ServiceBusClient
from azure.identity import DefaultAzureCredential
import os
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
credential = DefaultAzureCredential()
with ServiceBusClient(fully_qualified_namespace, credential) as client:
# max_wait_time specifies how long the receiver should wait with no incoming messages before stopping receipt.
# Default is None; to receive forever.
with client.get_queue_receiver(queue_name, max_wait_time=30) as receiver:
for msg in receiver: # ServiceBusReceiver instance is a generator.
print(str(msg))
# If it is desired to halt receiving early, one can break out of the loop here safely.
注意:任何以
receive_mode=PEEK_LOCK
(这是默认模式,替代模式RECEIVE_AND_DELETE在接收时立即从队列中删除消息)接收的消息都有一个锁,在锁到期之前如果处理时间超过锁持续时间,则必须通过receiver.renew_message_lock
来更新锁。有关在后台自动执行此操作的辅助工具,请参阅AutoLockRenewer。锁持续时间在Azure队列或主题本身上设置。
通过ServiceBusReceiver.receive_messages()从队列接收消息
注意:
ServiceBusReceiver.receive_messages()
通过临时方法调用接收单条消息或受限制的消息列表,而不是从生成器永久接收。它总是返回一个列表。
from azure.servicebus import ServiceBusClient
from azure.identity import DefaultAzureCredential
import os
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
credential = DefaultAzureCredential()
with ServiceBusClient(fully_qualified_namespace, credential) as client:
with client.get_queue_receiver(queue_name) as receiver:
received_message_array = receiver.receive_messages(max_wait_time=10) # try to receive a single message within 10 seconds
if received_message_array:
print(str(received_message_array[0]))
with client.get_queue_receiver(queue_name) as receiver:
received_message_array = receiver.receive_messages(max_message_count=5, max_wait_time=10) # try to receive maximum 5 messages in a batch within 10 seconds
for message in received_message_array:
print(str(message))
在此示例中,max_message_count声明在达到指定的最大等待时间(以秒为单位)之前尝试接收的最大消息数。
注意:还应注意的是,与接收相比,
ServiceBusReceiver.peek_messages()
有细微的区别,因为它不会锁定正在查看的消息,因此它们不能被解决。
从启用会话的队列发送和接收消息
会话在队列或订阅之上提供先入先出和单接收语义。虽然实际的接收语法相同,但初始化略有不同。
from azure.servicebus import ServiceBusClient, ServiceBusMessage
from azure.identity import DefaultAzureCredential
import os
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
queue_name = os.environ['SERVICE_BUS_SESSION_QUEUE_NAME']
session_id = os.environ['SERVICE_BUS_SESSION_ID']
credential = DefaultAzureCredential()
with ServiceBusClient(fully_qualified_namespace, credential) as client:
with client.get_queue_sender(queue_name) as sender:
sender.send_messages(ServiceBusMessage("Session Enabled Message", session_id=session_id))
# If session_id is null here, will receive from the first available session.
with client.get_queue_receiver(queue_name, session_id=session_id) as receiver:
for msg in receiver:
print(str(msg))
注意:从会话接收的消息不需要像非会话接收器那样更新其锁;相反,锁管理在会话级别进行,可以使用
receiver.session.renew_lock()
更新会话锁。
与主题和订阅一起工作
主题和订阅为发送和接收消息提供了队列的替代方案。有关更详细的说明以及它们与队列的区别,请参阅此处的文档。
from azure.servicebus import ServiceBusClient, ServiceBusMessage
from azure.identity import DefaultAzureCredential
import os
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
topic_name = os.environ['SERVICE_BUS_TOPIC_NAME']
subscription_name = os.environ['SERVICE_BUS_SUBSCRIPTION_NAME']
credential = DefaultAzureCredential()
with ServiceBusClient(fully_qualified_namespace, credential) as client:
with client.get_topic_sender(topic_name) as sender:
sender.send_messages(ServiceBusMessage("Data"))
# If session_id is null here, will receive from the first available session.
with client.get_subscription_receiver(topic_name, subscription_name) as receiver:
for msg in receiver:
print(str(msg))
在接收后解决消息
从队列接收时,您可以对接收到的消息执行多项操作。
注意:您只能解决在
ServiceBusReceiveMode.PEEK_LOCK
模式(这是默认模式)中接收到的ServiceBusReceivedMessage
对象。在ServiceBusReceiveMode.RECEIVE_AND_DELETE
模式下,接收时会从队列中删除消息。peek_messages()
返回的ServiceBusReceivedMessage
消息不能解决,因为消息锁没有像上述接收方法那样被获取。
如果消息有如上所述的锁,则如果消息锁已过期,结算将失败。如果处理时间将超过锁的持续时间,则必须在它过期之前通过receiver.renew_message_lock
来维持。锁的持续时间是在Azure的队列或主题本身上设置的。请参阅AutoLockRenewer以获取在后台自动执行此操作的辅助工具。
完成
声明消息处理成功完成,从队列中删除消息。
from azure.servicebus import ServiceBusClient
from azure.identity import DefaultAzureCredential
import os
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
credential = DefaultAzureCredential()
with ServiceBusClient(fully_qualified_namespace, credential) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.complete_message(msg)
放弃
暂时放弃处理消息,立即将消息返回到队列,由另一个(或同一个)接收器来接收。
from azure.servicebus import ServiceBusClient
from azure.identity import DefaultAzureCredential
import os
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
credential = DefaultAzureCredential()
with ServiceBusClient(fully_qualified_namespace, credential) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.abandon_message(msg)
死信
将消息从主队列转移到特殊的“死信子队列”,可以使用带有参数sub_queue=ServiceBusSubQueue.DEAD_LETTER
的ServiceBusClient.get_<queue|subscription>_receiver
函数访问它,并像任何其他接收器一样消费。请参阅此处的示例。
from azure.servicebus import ServiceBusClient
from azure.identity import DefaultAzureCredential
import os
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
credential = DefaultAzureCredential()
with ServiceBusClient(fully_qualified_namespace, credential) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.dead_letter_message(msg)
延迟
延迟与之前的结算方法略有不同。通过将其放置在一边,防止直接从队列接收消息,必须通过调用ServiceBusReceiver.receive_deferred_messages
来按顺序号接收(请参阅此处的示例)。
from azure.servicebus import ServiceBusClient
from azure.identity import DefaultAzureCredential
import os
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
credential = DefaultAzureCredential()
with ServiceBusClient(fully_qualified_namespace, credential) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.defer_message(msg)
自动续订消息或会话锁
注意:请参阅有关自动锁续期的参考文档。
AutoLockRenewer
是一种确保您的消息或会话即使在长时间内仍然锁定的一种简单方法,如果调用receiver.renew_message_lock
/receiver.session.renew_lock
不切实际或不受欢迎。内部,它不仅仅是创建一个并发看门狗以在对象接近过期时执行锁续期的简写。它应如下使用
- 消息锁自动续期
from azure.servicebus import ServiceBusClient, AutoLockRenewer
from azure.identity import DefaultAzureCredential
import os
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
# Can also be called via "with AutoLockRenewer() as renewer" to automate closing.
renewer = AutoLockRenewer()
credential = DefaultAzureCredential()
with ServiceBusClient(fully_qualified_namespace, credential) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver.receive_messages():
renewer.register(receiver, msg, max_lock_renewal_duration=60)
# Do your application logic here
receiver.complete_message(msg)
renewer.close()
- 会话锁自动续期
from azure.servicebus import ServiceBusClient, AutoLockRenewer
from azure.identity import DefaultAzureCredential
import os
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
session_queue_name = os.environ['SERVICE_BUS_SESSION_QUEUE_NAME']
session_id = os.environ['SERVICE_BUS_SESSION_ID']
# Can also be called via "with AutoLockRenewer() as renewer" to automate closing.
renewer = AutoLockRenewer()
credential = DefaultAzureCredential()
with ServiceBusClient(fully_qualified_namespace, credential) as client:
with client.get_queue_receiver(session_queue_name, session_id=session_id) as receiver:
renewer.register(receiver, receiver.session, max_lock_renewal_duration=300) # Duration for how long to maintain the lock for, in seconds.
for msg in receiver.receive_messages():
# Do your application logic here
receiver.complete_message(msg)
renewer.close()
如果由于任何原因自动续期被中断或失败,可以通过正在续期的对象的auto_renew_error
属性观察到,或者通过在续期器初始化时传递回调给on_lock_renew_failure
参数。当尝试对指定的对象采取行动(如完成消息)时,也会体现出来。
故障排除
日志记录
- 启用
azure.servicebus
日志记录器以收集库的跟踪信息。 - 通过在创建客户端时设置
logging_enable=True
来启用AMQP帧级别的跟踪。
import logging
import sys
handler = logging.StreamHandler(stream=sys.stdout)
logger = logging.getLogger('azure.servicebus')
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
...
from azure.servicebus import ServiceBusClient
client = ServiceBusClient(..., logging_enable=True)
超时
用户应了解库中的各种超时。
- 10分钟服务端链路关闭:一旦打开,链路将在10分钟空闲后关闭,以防止服务泄漏资源。这应该对用户来说是透明的,但如果您在如此长时间后注意到重新连接发生,这就是原因。对链路执行任何操作(包括管理操作)都将延长此超时。
- max_wait_time:在创建接收器或调用
receive_messages()
时提供,在无流量后接收消息的时间。这既适用于命令式receive_messages()
函数,也适用于在没有消息的情况下,生成器样式接收运行多长时间后退出。传递None(默认值)将无限期等待,直到10分钟的阈值,如果没有采取其他操作。
注意:如果处理消息或会话的时间足够长,导致超时,那么作为手动调用
receiver.renew_message_lock
/receiver.session.renew_lock
的替代方案,可以利用上面详细说明的AutoLockRenewer
功能。
常见异常
Service Bus API在azure.servicebus.exceptions
中生成以下异常。
- 服务总线连接错误:在连接到服务的过程中发生了错误。这可能是由于临时网络问题或服务问题造成的。建议重试。
- 服务总线授权错误:在授权连接到服务时发生错误。这可能是由于凭据没有执行操作的正确权限造成的。建议检查凭据的权限。
- 服务总线认证错误:在认证连接到服务时发生错误。这可能是由于凭据不正确造成的。建议检查凭据。
- 操作超时错误:这表明服务未在预期时间内对操作做出响应。这可能是由于临时网络问题或服务问题造成的。服务可能已成功或未成功完成请求;状态未知。建议尝试验证当前状态并在必要时重试。
- 消息大小超出限制错误:这表明消息内容大于服务总线帧大小。这可能发生在批量发送过多的服务总线消息或传递给
Message
体的内容过大时。建议减少批量发送的消息数量或单个ServiceBusMessage
的内容大小。 - 消息已解决:这表明解决消息失败。这可能在尝试解决已解决的消息时发生。
- 消息锁定丢失错误:消息的锁定已过期并被释放回队列。需要再次接收以便解决。您应该注意消息的锁定持续时间,并在长时间处理前在过期前续订锁定。
AutoLockRenewer
可以帮助自动续订消息的锁定。 - 会话锁定丢失错误:会话的锁定已过期。所有已接收但未解决的消息将无法解决。如需再次接收消息,建议重新连接到会话。您应该注意会话的锁定持续时间,并在长时间处理前在过期前续订锁定。
AutoLockRenewer
可以帮助自动续订会话的锁定。 - 消息未找到错误:尝试接收具有特定序列号的消息。此消息未找到。请确保消息尚未被接收。检查死信队列以查看消息是否已被死信。
- 消息实体未找到错误:与操作关联的实体不存在或已被删除。请确保实体存在。
- 消息实体禁用错误:对已禁用实体的运行时操作请求。请激活该实体。
- 服务总线配额超出错误:消息实体已达到其最大允许大小,或已超出命名空间的连接最大数量。通过从实体或其子队列接收消息来创建实体空间。
- 服务总线服务器忙错误:服务无法在此时刻处理请求。客户端可以等待一段时间,然后重试操作。
- 服务总线通信错误:客户端无法建立到服务总线的连接。请确保提供的主机名正确且主机可达。如果您的代码在具有防火墙/代理的环境中运行,请确保对服务总线域名/IP地址和端口的流量没有被阻止。
- 会话无法锁定错误:尝试连接到具有特定会话ID的会话,但会话当前被另一个客户端锁定。请确保其他客户端已解锁会话。
- 自动锁定续租失败: 在后台尝试续租消息或会话的锁定失败。这可能在由
AutoLockRenewer
使用的接收器被关闭或可续租的锁定已过期时发生。建议通过接收消息或再次连接到会话实体来重新注册可续租的消息或会话。 - 自动锁定续租超时: 分配用于续租消息或会话锁定的超时时间已过期。您可以重新注册希望自动续租锁定的对象或提前延长超时时间。
- 服务总线错误: 所有其他与服务总线相关的错误。它是上述所有错误的根错误类。
请查看异常参考文档,以获取我们常见异常类型的详细描述。
下一步
更多示例代码
请在此处的 示例 目录中找到更多示例,展示常见的 Service Bus 场景,如发送、接收、会话管理和消息处理。
附加文档
有关服务总线服务的更详细文档,请参阅docs.microsoft.com上的服务总线文档。
管理功能和相关文档
对于想要对服务总线执行管理操作的用户(例如创建队列/主题等、更改过滤器规则、枚举实体),请参阅azure-mgmt-servicebus文档以获取API文档。简短的使用示例可以在这里找到。
纯Python AMQP传输和向后兼容性支持
Azure服务总线客户端库现在基于纯Python AMQP实现。《code>uAMQP 已作为必需依赖项删除。
要使用 uAMQP
作为底层传输
- 使用pip安装
uamqp
。
$ pip install uamqp
- 在客户端构造期间传递
uamqp_transport=True
。
from azure.servicebus import ServiceBusClient
connection_str = '<< CONNECTION STRING FOR THE SERVICE BUS NAMESPACE >>'
queue_name = '<< NAME OF THE QUEUE >>'
client = ServiceBusClient.from_connection_string(
connection_str, uamqp_transport=True
)
注意:在 ServiceBusMessage
/ServiceBusMessageBatch
/ServiceBusReceivedMessage
上,之前公开了 uamqp.Message
的 message
属性,现已弃用。已引入“Legacy”对象,以帮助简化过渡。
要启用 uamqp
日志记录器以收集底层 uAMQP 库的跟踪
import logging
uamqp_logger = logging.getLogger('uamqp')
uamqp_logger.setLevel(logging.DEBUG)
uamqp_logger.addHandler(handler)
...
from azure.servicebus import ServiceBusClient
client = ServiceBusClient(..., logging_enable=True)
在某些情况下,您可能认为 uamqp
日志记录过于详细。要抑制不必要的日志记录,请将以下代码片段添加到代码顶部
import logging
# The logging levels below may need to be changed based on the logging that you want to suppress.
uamqp_logger = logging.getLogger('uamqp')
uamqp_logger.setLevel(logging.ERROR)
# or even further fine-grained control, suppressing the warnings in uamqp.connection module
uamqp_connection_logger = logging.getLogger('uamqp.connection')
uamqp_connection_logger.setLevel(logging.ERROR)
从源代码构建uAMQP轮
azure-servicebus
依赖于 uAMQP 以实现AMQP协议。大多数主要操作系统都提供了uAMQP轮,在安装 azure-servicebus
时将自动安装。如果打算将 uAMQP 用作 azure-servicebus
的底层AMQP协议实现,大多数主要操作系统都提供了uAMQP轮。
如果您在未提供uAMQP轮的平台运行,请按照以下uAMQP安装指南从源代码安装。
贡献
此项目欢迎贡献和建议。大多数贡献都需要您同意一份贡献者许可协议(CLA),声明您有权并实际上授予我们使用您的贡献的权利。有关详细信息,请访问https://cla.microsoft.com。
当您提交拉取请求时,CLA机器人会自动确定您是否需要提供CLA,并以适当的方式装饰PR(例如,标签,注释)。只需遵循机器人提供的说明即可。您只需在整个使用我们CLA的存储库中执行一次此操作。
此项目已采用Microsoft开源代码行为准则。有关更多信息,请参阅代码行为准则FAQ或联系opencode@microsoft.com,如有任何其他问题或评论。
发行历史
7.12.3 (2024-09-19)
已修复的错误
- 修复了在长时间运行操作中令牌刷新未发生的问题(35717)
- 修复了使用TokenCredential创建具有转发功能的订阅时导致
ResourceNotFoundError
的问题(36545) - 修复了在一个接收器上接收到的消息无法在另一个接收器上通过管理链路解决的问题(35304)
- 解决了接收大消息时分配了过多的链接信用额度的问题(34270)
7.12.2 (2024-05-08)
已修复的错误
- 修复了在使用AmqpOverWebsocket接收时未捕获到WebsocketConnectionClosedException的问题(34859)
- 修复了对typing-extensions的依赖不正确的问题(34869,感谢@YaroBear)。
7.12.1 (2024-03-20)
已修复的错误
其他更改
- 更新了日志记录,以更准确地表示何时发送帧,从而防止客户端空闲超时(#34793)。
7.12.0 (2024-03-06)
新增功能
- 更新了ServiceBusReceiver构造函数中的
max_wait_time
,允许用户在使用NEXT_AVAILABLE_SESSION时更改会话的默认服务器超时时间65秒。
其他更改
- 将最低的
azure-core
版本更新到1.28.0。 - 更新了纯Python AMQP网络跟踪日志,按照OpenTelemetry规范将AMQP连接信息中的
None
值替换为空字符串(#32190)。 - 更新了纯Python AMQP网络跟踪日志的错误日志,在连接关闭时将错误日志级别调整为警告(PR #34504,感谢@RichardOberdieck)。
7.11.4 (2023-11-13)
已修复的错误
- 修复了由azure amqp错误解析两个字符的会话ID的问题。
7.11.3 (2023-10-11)
已修复的错误
7.11.2 (2023-09-13)
已修复的错误
- 修复了由于阻塞进程导致的连接断开时抛出的错误
NoneType object has no attribute 'settle_messages'
。
其他更改
- 在
azure.servicebus
中添加了__contains__
方法(PR #30846,感谢@pamelafox)。ServiceBusConnectionStringProperties
amqp.AmqpMessageHeader
amqp.AmqpMessageProperties
management.AccessRights
management.NamespaceProperties
management.QueueProperties
management.TopicProperties
management.SubscriptionProperties
management.RuleProperties
7.11.1 (2023-07-12)
已修复的错误
- 修复了当服务发送断开连接时抛出的错误
end frame received on invalid channel
(#30860) - 修复了客户端关闭和从服务断开连接时抛出的错误
link already closed
(#30836)
其他更改
- 尝试完成从非会话实体接收到的已过期锁定的消息时抛出的错误已更新为更细粒度的
MessageLockLostError
,该错误来自超类ServiceBusError
。
7.11.0 (2023-06-12)
新增功能
- 在同步和异步的
ServiceBusClient
上的get_queue_sender
、get_queue_receiver
、get_topic_sender
和get_subscription_receiver
方法中添加了一个新的浮点关键字参数socket_timeout
。
已修复的错误
- 修复了在套接字写入超时时发送大消息失败的问题(#30425)。
- 修复了由于
delivery_id
为None
而导致解决大消息失败的问题。
其他更改
- 跟踪更新
- 如果未找到消息应用程序属性中的
traceparent
消息应用属性,则接收/发送跨度上的跨度链接现在将回退到使用Diagnostic-Id
。 - 即使消息应用程序属性中找不到上下文传播头,现在也会为接收/发送跨度创建跨度链接。
- 已从所有跨度中删除了
component
属性。
- 如果未找到消息应用程序属性中的
7.10.0 (2023-05-09)
版本7.10.0是基于纯Python实现的AMQP堆栈的Azure Service Bus客户端库的第一个稳定版本。
新增功能
- 已向同步和异步
ServiceBusClient
构造函数添加了新的布尔关键字参数uamqp_transport
,该参数指示是否使用uamqp
库或默认纯Python AMQP库作为底层传输。
破坏性更改
- 以下作为依赖项添加,用于在WebSocket上执行操作
websocket-client
用于同步aiohttp
用于异步
- 从必需依赖项中删除了uAMQP,并将其添加为使用
uamqp_transport
关键字的可选依赖项。
已修复的错误
- 修复了同步和异步
ServiceBusAdministrationClient
期望credential
具有get_token
方法返回类型为bytes
的AccessToken.token
而不是str
的问题,现在与文档一致。 - 修复了在
ServiceReceivedBusMessage
上返回的raw_amqp_message.header
和message.header
属性时,默认设置了由服务设置的durable
、first_acquirer
和priority
属性,而不是服务返回的值的问题。 - 修复了
ServiceBusReceivedMessage
不可序列化的问题(问题编号#27947)。
其他更改
ServiceBus
/ServiceBusMessageBatch
/ServiceBusReceivedMessage
上的message
属性,之前暴露了uamqp.Message
/uamqp.BatchMessage
,已被弃用。- 引入了
LegacyMessage
/LegacyBatchMessage
对象,以帮助促进过渡。
- 引入了
- 从必需依赖项中删除了uAMQP。
- 将
uamqp >= 1.6.3
作为使用uamqp_transport
关键字的可选依赖项添加。 - 更新跟踪(#29995)
- 向现有跨度添加了更多属性
messaging.system
- 消息系统(例如,servicebus
)messaging.operation
- 操作类型(例如,publish
、receive
或settle
)messaging.batch.message_count
- 发送或接收的消息数量(如果有多个)
- 现在将在调用服务的调用上创建跨度,该服务解决消息。
- 跨度名称将包含解决操作(例如,
ServiceBus.complete
) - 跨度将包含
az.namespace
、messaging.destination.name
、net.peer.name
、messaging.system
和messaging.operation
属性。
- 跨度名称将包含解决操作(例如,
- 现在,所有
send
跨度都包含对message
跨度的链接。现在,message
跨度将不再包含对send
跨度的链接。
- 向现有跨度添加了更多属性
7.10.0b1(2023-04-13)
新增功能
- 已向同步和异步
ServiceBusClient
构造函数添加了新的布尔关键字参数uamqp_transport
,该参数指示是否使用uamqp
库或默认纯Python AMQP库作为底层传输。
已修复的错误
- 修复了同步和异步
ServiceBusAdministrationClient
期望credential
具有get_token
方法返回类型为bytes
的AccessToken.token
而不是str
的问题,现在与文档一致。 - 修复了在
ServiceReceivedBusMessage
上返回的raw_amqp_message.header
和message.header
属性时,默认设置了由服务设置的durable
、first_acquirer
和priority
属性,而不是服务返回的值的问题。
其他更改
ServiceBus
/ServiceBusMessageBatch
/ServiceBusReceivedMessage
上的message
属性,之前暴露了uamqp.Message
/uamqp.BatchMessage
,已被弃用。- 引入了
LegacyMessage
/LegacyBatchMessage
对象,以帮助促进过渡。
- 引入了
- 从必需依赖项中删除了uAMQP。
- 将
uamqp >= 1.6.3
作为使用uamqp_transport
关键字的可选依赖项添加。
7.9.0 (2023-04-11)
破坏性更改
- 默认情况下,现在已禁用同步和异步
ServiceBusAdministrationClient
的客户端输入验证。这意味着在输入无效的情况下,ServiceBusAdministrationClient
不会引发msrest.exceptions.ValidationError
。如果服务器拒绝请求,现在可能会引发azure.core.exceptions.HttpResponseError
。
已修复的错误
- 修复了
azure.servicebus.management
中的枚举成员不遵循大写约定的问题。
其他更改
- 已删除所有纯Python AMQP堆栈相关更改,将在下一个版本中重新添加。
- 更新了最低
azure-core
版本为1.24.0。 - 删除了
msrest
依赖项。 - 删除了
azure-common
依赖项。
7.9.0b1(2023-03-09)
新增功能
- 已将来自Service Bus实体的迭代器添加回。
7.8.3 (2023-03-09)
已修复的错误
- 修复了异步添加分布式跟踪属性的方法未被等待的问题(问题编号 #28738)。
7.8.2 (2023-01-10)
已修复的错误
- 修复了一个在将 None 发送到 set_state 而不是清除会话状态时会导致异常的漏洞(问题编号 #27582)。
其他更改
- 将 uAMQP 依赖项更新到 1.6.3。
- 添加了对 Python 3.11 的支持。
7.9.0a1(2022-10-11)
版本 7.9.0a1 是我们基于纯 Python 实现的 AMQP 堆栈构建 Azure 服务总线客户端库的首次尝试。
破坏性更改
- 以下功能已被暂时移除,将在未来的预览版中重新添加,因为我们致力于稳定发布
- 从服务总线实体接收迭代器。
其他更改
- 移除了 uAMQP 依赖项。
7.8.1 (2022-10-11)
此版本和所有未来的版本将需要 Python 3.7+。Python 3.6 将不再受支持。
已修复的错误
- 修复了在异步 ServiceBusClient 中,custom_endpoint_address 和 connection_verify 关键字参数未被正确传递的问题。(问题编号 #26015)
7.8.0 (2022-07-06)
此版本将是最后一个官方支持 Python 3.6 的版本,未来的版本将需要 Python 3.7+。
新增功能
- 在 ServiceBusClient 中,get_queue_receiver、get_subscription_receiver、get_queue_sender 和 get_topic_sender 现在接受一个可选的 client_identifier 参数,允许指定相应的发送器或接收器的自定义标识符。在调试期间这可能很有用,因为服务总线将此 ID 与错误关联,有助于更容易地进行关联。
- ServiceBusReceiver 和 ServiceBusSender 添加了 client_identifier 属性,它返回当前实例的 client_identifier。
7.7.0 (2022-06-07)
已修复的错误
- 修复了默认情况下 AMQP 异常可重试的漏洞,如果不满足非可重试条件,则确保重试 InternalServerErrors。
新增功能
- ServiceBusClient 构造函数现在接受可选的 custom_endpoint_address 参数,允许指定与 Service Bus 服务通信时使用的自定义端点,当您的网络不允许与标准 Service Bus 端点通信时很有用。
- ServiceBusClient 构造函数现在接受可选的 connection_verify 参数,允许指定用于验证连接端点身份的 SSL 证书的自定义 CA_BUNDLE 文件的路径。
7.6.1 (2022-04-11)
其他更改
- 通过在 ServiceBusReceiver 的 prefetch_count 设置为 0 且没有活动接收调用时释放消息,改进了接收,这有助于避免接收过期消息和增加消息的投递计数。
7.6.0 (2022-02-10)
新增功能
- 引入了 ServiceBusMessageState 枚举,可以假定 active、scheduled 或 deferred 的值。
- 在 ServiceBusReceivedMessage 中添加了 state 属性。
7.5.0 (2022-01-12)
此版本和所有未来的版本将需要 Python 3.6+。Python 2.7 将不再受支持。
新增功能
- 添加了对固定(线性)重试退避的支持。
- Sync/async ServiceBusClient 构造函数和 from_connection_string 接受 retry_mode 作为关键字参数。
- 添加了新的枚举类 ServiceBusSessionFilter,它是现有 NEXT_AVAILABLE_SESSION 值的类型。
已修复的错误
- 修复了当使用 datetime.timedelta 设置 ServiceBusMessage.time_to_live 时,应该尊重 total_seconds 的问题(PR #21869,感谢 @jyggen)。
其他更改
- 改进了令牌刷新时间,以防止在令牌即将过期时阻塞主流程。
- 将 uAMQP 依赖项更新到 1.5.1。
7.4.0 (2021-11-09)
新增功能
- 正式支持在 ServiceBusAdministrationClient 中创建和更新大消息大小的队列和主题。此功能仅适用于 Premium 层服务总线。
- ServiceBusAdministrationClient 上的 create_queue、create_topic、update_queue 和 update_topic 方法现在接受一个新关键字参数 max_message_size_in_kilobytes。
- QueueProperties 和 TopicProperties 现在有一个新的实例变量 max_message_size_in_kilobytes。
- ServiceBusAdministrationClient 的构造函数以及 ServiceBusAdministrationClient.from_connection_string 现在接受关键字参数 api_version 以配置服务总线 API 版本。支持的服务版本是 "2021-05" 和 "2017-04"。
- 添加了新的枚举类 azure.servicebus.management.ApiVersion 以表示支持的服务总线 API 版本。
已修复的错误
- 修复了
ServiceBusReceiver
无法连接到会话实体(会话ID为空字符串)的bug。 - 修复了
ServiceBusMessage.partition_key
无法正确解析空字符串的bug。
7.4.0b1 (2021-10-06)
新增功能
- 在
ServiceBusAdministrationClient
中添加了对创建和更新大消息大小的队列和主题的支持。此功能仅适用于高级别的Service Bus。- ServiceBusAdministrationClient 上的 create_queue、create_topic、update_queue 和 update_topic 方法现在接受一个新关键字参数 max_message_size_in_kilobytes。
- QueueProperties 和 TopicProperties 现在有一个新的实例变量 max_message_size_in_kilobytes。
7.3.4 (2021-10-06)
其他更改
- 更新了uAMQP依赖到1.4.3。
- 添加了对Python 3.10的支持。
- 修复了win32 socketio和tlsio中的内存泄漏(问题#19777)。
- 修复了将AMQPValue转换为字符串过程中的内存泄漏(问题#19777)。
7.3.3 (2021-09-08)
已修复的错误
- 改进了
ServiceBusClient
的内存使用,当不再存在对发送器或接收器的强引用时,自动丢弃其处理器集中的ServiceBusSender
或ServiceBusReceiver
。 - 在续订锁期间降低了
azure.servicebus.AutoLockRenewer
的CPU负载。
7.3.2 (2021-08-10)
已修复的错误
- 修复了
azure.servicebus.aio.AutoLockRenewer
在未注册任何消息时释放会话崩溃的bug(问题#19642)。 - 修复了
azure.servicebus.AutoLockRenewer
只支持每次自动续订max_workers
个消息/会话的bug(问题#19362)。
7.3.1 (2021-07-07)
修复了
- 修复了当设置
ServiceBusMessage.partition_key
时,输入值不应与None的session_id
进行验证的bug(PR #19233,感谢 @bishnu-shb)。 - 修复了在Ubuntu 20.04上设置
ServiceBusMessage.time_to_live
导致 OverflowError 错误的bug。 - 修复了
AmqpAnnotatedProperties.creation_time
和AmqpAnnotatedProperties.absolute_expiry_time
应该以毫秒为单位而不是秒为单位计算的bug。 - 更新了uAMQP依赖到1.4.1。
- 修复了在MessageProperties上的creation_time、absolute_expiry_time和group_sequence属性应与Python 2.7上的整型类型兼容的bug。
7.3.0 (2021-06-08)
新功能
- 支持发送AMQP注解消息,允许完全访问AMQP消息字段,现已GA。
- 引入了新的命名空间
azure.servicebus.amqp
。 - 引入了新的类
azure.servicebus.amqp.AmqpMessageHeader
和azure.servicebus.amqp.AmqpMessageProperties
以访问amqp头和属性。
- 引入了新的命名空间
从7.2.0b1起的重大更改
- 将
azure.servicebus.AMQPAnnotatedMessage
重命名为azure.servicebus.amqp.AmqpAnnotatedMessage
并移动位置。 - 将
azure.servicebus.AMQPMessageBodyType
重命名为azure.servicebus.amqp.AmqpMessageBodyType
并移动位置。 AmqpAnnotatedMessage.header
返回azure.servicebus.amqp.AmqpMessageHeader
而不是uamqp.message.MessageHeader
。AmqpAnnotatedMessage.properties
返回azure.servicebus.amqp.AmqpMessageProperties
而不是uamqp.message.MessageProperties
。ServiceBusMessage
和ServiceBusReceivedMessage
上的raw_amqp_message
现在是只读属性而不是实例变量。
错误修复
- 修复了
ServiceBusReceiver
迭代器在从连接错误恢复后停止迭代的bug(问题#18795)。
7.2.0 (2021-05-13)
在7.2.0b1中引入的与AMQPAnnotatedMessage相关的预览功能不包括在本版本中。
新功能
- 添加了对使用
azure.core.credentials.AzureNamedKeyCredential
作为客户端认证凭据的支持。 - 使用
azure.core.credentials.AzureSasCredential
作为客户端认证凭据的支持现已GA。 ServiceBusAdministrationClient.update_*
方法现在接受关键字参数以覆盖模型实例中指定的属性。
错误修复
- 修复了当属性是实体而不是完整路径时,
update_queue
和update_subscription
方法会修改模型实例的forward_to
和forward_dead_lettered_messages_to
属性的bug。 - 改进了
ServiceBusMessage
和ServiceBusReceivedMessage
上的repr
以显示更有意义的文本。 - 更新了uAMQP依赖到1.4.0。
- 修复了在链接附加过程中存在内存泄漏的bug,其中源和目标cython对象没有正确释放(问题#15747)。
- 改进了管理操作回调,不将非AMQP_TYPE_STRING类型的描述值解析为字符串(问题#18361)。
注意
- 更新了azure-core依赖到1.14.0。
7.2.0b1 (2021-04-07)
新功能
- 添加了对使用
azure.core.credentials.AzureSasCredential
作为客户端认证凭据的支持。 - 添加了对发送AMQP注释消息的支持,允许完全访问AMQP消息字段。现在
azure.servicebus.AMQPAnnotatedMessage
是公开的,并且可以用于发送。 - 添加了新的枚举类
azure.servicebus.AMQPMessageBodyType
来表示消息的消息体类型,包括DATA
:消息体由一个或多个数据部分组成,每个部分包含不透明的二进制数据。SEQUENCE
:消息体由一个或多个序列部分组成,每个部分包含任意数量的结构化数据元素。VALUE
:消息体由一个AMQP值部分组成,该部分包含一个AMQP值。
- 在
azure.servicebus.ServiceBusMessage
和azure.servicebus.ReceivedMessage
上添加了新的属性body_type
,它返回azure.servicebus.AMQPMessageBodyType
。
7.1.1 (2021-04-07)
本版本和所有未来版本将需要Python 2.7或Python 3.6+,Python 3.5不再受支持。
新功能
- 更新了同步和异步
ServiceBusAdministrationClient
上的create_queue
、update_queue
、create_subscription
和update_subscription
方法中的forward_to
和forward_dead_lettered_messages_to
参数,使其接受实体,而不仅仅是完整路径。如果传递了实体,则假定该实体位于用于构建ServiceBusAdministrationClient
的同一命名空间中。
错误修复
- 将uAMQP依赖项更新到1.3.0。
- 修复了在底层套接字连接丢失时发送大型消息触发段错误的问题(#13739,#14543)。
- 修复了链路流控制中的错误,其中链路信用额和交付计数应根据每条消息而不是每帧传输来计算(#16934)。
7.1.0 (2021-03-09)
本版本将是最后一个官方支持Python 3.5的版本,未来版本将需要Python 2.7或Python 3.6+。
新功能
- 更新了以下方法,以便接受列表和Mapping表示的单个实例作为相应的强类型对象参数(PR #14807,感谢@bradleydamato)
ServiceBusAdministrationClient
上的update_queue
、update_topic
、update_subscription
和update_rule
分别接受QueueProperties
、TopicProperties
、SubscriptionProperties
和RuleProperties
的Mapping表示。ServiceBusSender
的同步和异步版本上的send_messages
和schedule_messages
接受ServiceBusMessage
的Mapping表示的列表或单个实例。ServiceBusMessageBatch
上的add_message
现在接受ServiceBusMessage
的Mapping表示。
错误修复
- 由于连接上10分钟内没有活动而导致的
uamqp.errors.LinkForceDetach
错误引起的操作失败现在将内部重试,除了会话接收器的情况。 - 具有条件代码
amqp:unknown-error
的uamqp.errors.AMQPConnectionError
错误现在分类为ServiceBusConnectionError
而不是通用的ServiceBusError
。 - 在
ServiceBusManagementClient
上的update_*
方法在遇到不支持输入类型的情况下将引发TypeError
而不是AttributeError
。
7.0.1 (2021-01-12)
错误修复
forward_to
和forward_dead_lettered_messages_to
在用于队列和订阅的ServiceBusAdministrationClient
中不再导致授权错误(#15543)。- 将uAMQP依赖项更新到1.2.13。
- 修复了macOS无法检测网络错误的问题(#15473)。
- 修复了在连接建立期间
uamqp.ReceiveClient
和uamqp.ReceiveClientAsync
接收消息的问题(#15555)。 - 修复了在macOS上使用Clang 12时连接建立触发不可识别选择器异常的问题(#15567)。
- 修复了访问消息属性时,当底层的C字节为NULL时触发段错误的问题(#15568)。
7.0.0 (2020-11-23)
注意: 这是
azure-servicebus
包的GA(通用可用)版本,推出在先前的预览版本之上构建的官方API表面区域。建议从v0.50
迁移的用户查看迁移指南。
新功能
- 现在可以将
sub_queue
和receive_mode
作为有效的字符串(由它们各自的枚举类型定义)以及它们的枚举形式传递,以构建ServiceBusReceiver
。 - 增加了对发送、接收和计划场景的分布式跟踪的支持。
破坏性更改
ServiceBusSender
和ServiceBusReceiver
现在不再可重用,并在尝试在已关闭的处理程序上操作时引发ValueError
。- 将
ReceiveMode
重命名为ServiceBusReceiveMode
,将SubQueue
重命名为ServiceBusSubQueue
,并将它们的枚举值从整数转换为可读的字符串。 - 将枚举值
DeadLetter
重命名为DEAD_LETTER
,TransferDeadLetter
重命名为TRANSFER_DEAD_LETTER
,PeekLock
重命名为PEEK_LOCK
,ReceiveAndDelete
重命名为RECEIVE_AND_DELETE
,以符合未来的SDK指南。 - 现在,如果提供空的消息列表或空批次,则
send_messages
、schedule_messages
、cancel_scheduled_messages
和receive_deferred_messages
将执行无操作(no-op)而不是引发ValueError
。 ServiceBusMessage.amqp_annotated_message
已重命名为ServiceBusMessage.raw_amqp_message
,以与其他SDK保持一致。- 根据服务定义的错误条件重新设计错误层次结构。
- 由于它是客户端验证,因此
MessageAlreadySettled
现在从ValueError
继承,而不是从ServiceBusMessageError
继承。 - 已删除
NoActiveSession
,现在它被OperationTimeoutError
替换,因为客户端在尝试连接到任何可用会话时超时。 - 已删除
ServiceBusMessageError
,因为基于错误条件的异常提供全面错误信息。 - 已删除
MessageSettleFailed
,因为基于错误条件的异常提供全面错误信息。 - 已删除
MessageSendFailed
,因为基于错误条件的异常提供全面错误信息。 - 将
MessageContentTooLarge
重命名为MessageSizeExceededError
,以与服务的定义保持一致。 - 将
MessageLockExpired
重命名为MessageLockLostError
,以与服务的定义保持一致。 - 将
SessionLockExpired
重命名为SessionLockLostError
,以与服务的定义保持一致。 - 引入了
MessageNotFoundError
,当请求的消息找不到时将引发此异常。 - 引入了
MessagingEntityNotFoundError
,当服务总线服务无法找到服务总线资源时将引发此异常。 - 引入了
MessagingEntityDisabledError
,当消息实体被禁用时将引发此异常。 - 引入了
MessagingEntityAlreadyExistsError
,当在相同命名空间下存在具有相同名称的实体时将引发此异常。 - 引入了
ServiceBusQuotaExceededError
,当与Azure服务总线服务交互时,如果服务总线资源超出限制,将引发此异常。 - 引入了
ServiceBusServerBusyError
,当Azure服务总线服务在响应客户端请求执行操作时报告它正忙时将引发此异常。 - 引入了
ServiceBusCommunicationError
,当在交互Azure服务总线服务时遇到通用通信错误时将引发此异常。 - 引入了
SessionCannotBeLockedError
,当请求的会话无法被锁定时将引发此异常。
- 由于它是客户端验证,因此
- 在特定用例上引入了新的客户端验证。
ServiceBusMessage
现在在提供无效的主体类型时将引发TypeError
。有效的主体是字符串、字节和 None。列表不再被接受,因为它们只是简单地将内容连接起来。- 现在将
receive_mode
设置为不适当的值将引发ValueError
而不是TypeError
,以支持可扩展的枚举。 - 将
ServiceBusMessage.partition_key
设置为与消息实例上的session_id
不同的值现在将引发ValueError
。 ServiceBusClient.get_queue/topic_sender
和ServiceBusClient.get_queue/subscription_receiver
现在如果queue_name
或topic_name
与用于构建ServiceBusClient
的连接字符串中的EntityPath
不匹配,将引发ValueError
。- 处理已窥视的消息将引发
ValueError
。 - 在
RECEIVE_AND_DELETE
接收模式下处理消息或续订消息的锁将引发ValueError
。 - 在
ServiceBusMessage
上设置超过 128 个字符的session_id
、reply_to_session_id
、message_id
和partition_key
将引发ValueError
。
- 目前将
ServiceBusReceiver.get_streaming_message_iter
设为内部使用,以便在提交向后兼容性之前评估使用模式;可以通过迭代接收器本身以等效方式迭代消息。
错误修复
- 默认情况下,现在使用
ServiceBusAdministrationClient.create_rule
创建TrueRuleFilter
规则。 - 现在支持带有可删除空格或协议头(例如 'sb://')的 FQDN 和连接字符串。
- 在使用
auto_lock_renewer
参数和一个会话接收器的同时使用ReceiveMode.ReceiveAndDelete
将不再因为无法将消息注册到续订器而失败。
7.0.0b8(2020-11-05)
新功能
- 以下操作已添加对
timeout
参数的支持ServiceBusSender
:send_messages
、schedule_messages
和cancel_scheduled_messages
ServiceBusReceiver
:receive_deferred_messages
、peek_messages
和renew_message_lock
ServiceBusSession
:get_state
、set_state
和renew_lock
azure.servicebus.exceptions.ServiceBusError
现在继承自azure.core.exceptions.AzureError
。- 添加了一个
parse_connection_string
方法,该方法将连接字符串解析为包含其组成部分的属性包。 - 在
get_queue_receiver
和get_subscription_receiver
调用上添加了对auto_lock_renewer
参数的支持,以便自动注册消息和会话进行自动续订。
破坏性更改
- 将
AutoLockRenew
重命名为AutoLockRenewer
。 - 已删除类
ServiceBusSessionReceiver
,现在它统一在类ServiceBusReceiver
中。- 已删除方法
ServiceBusClient.get_queue_session_receiver
和ServiceBusClient.get_subscription_session_receiver
。 ServiceBusClient.get_queue_receiver
和ServiceBusClient.get_subscription_receiver
现在接受关键字参数session_id
,当获取会话实体的接收器时必须设置。
- 已删除方法
ServiceBusError.__init__
接收的参数inner_exception
现在已重命名为error
。- 将
azure.servicebus.exceptions.MessageError
重命名为azure.servicebus.exceptions.ServiceBusMessageError
。 - 已删除错误
azure.servicebus.exceptions.ServiceBusResourceNotFound
,因为现在当使用ServiceBusAdministrationClient
时,如果 Service Bus 资源不存在,将引发azure.core.exceptions.ResourceNotFoundError
。 - 将
Message
重命名为ServiceBusMessage
。 - 将
ReceivedMessage
重命名为ServiceBusReceivedMessage
。 - 将
BatchMessage
重命名为ServiceBusMessageBatch
。- 在类中将方法
add
重命名为add_message
。
- 在类中将方法
- 已删除类
PeekedMessage
。 - 在模块
azure.servicebus.aio
下删除了类ReceivedMessage
。 - 将
ServiceBusSender.create_batch
重命名为ServiceBusSender.create_message_batch
。 - 异常
MessageSendFailed
、MessageSettleFailed
和MessageLockExpired
现在继承自azure.servicebus.exceptions.ServiceBusMessageError
。 ServiceBusSession
中的get_state
现在返回bytes
而不是string
。ServiceBusReceiver.receive_messages/get_streaming_message_iter
和ServiceBusClient.get_<queue/subscription>_receiver
现在如果给定的max_wait_time
小于或等于 0,将引发 ValueError。- 将消息处理方法从
ServiceBusMessage
移至ServiceBusReceiver
。- 使用
ServiceBusReceiver.complete_message
代替ServiceBusReceivedMessage.complete
来完成消息。 - 使用
ServiceBusReceiver.abandon_message
代替ServiceBusReceivedMessage.abandon
来放弃消息。 - 使用
ServiceBusReceiver.defer_message
代替ServiceBusReceivedMessage.defer
来延迟消息。 - 使用
ServiceBusReceiver.dead_letter_message
代替ServiceBusReceivedMessage.dead_letter
来将消息放入死信队列。
- 使用
- 消息结算方法(
complete_message
、abandon_message
、defer_message
和dead_letter_message
)以及使用amqp管理链接请求的方法(如schedule_messages
、received_deferred_messages
等)现在除了抛出MessageSettleFailed
和ServiceBusError
异常外,还会抛出更具体的异常。 - 将消息
renew_lock
方法从ServiceBusMessage
移至ServiceBusReceiver
。- 将
ServiceBusReceivedMessage.renew_lock
更改为ServiceBusReceiver.renew_message_lock
。
- 将
AutoLockRenewer.register
现在以ServiceBusReceiver
作为位置参数。- 从
ServiceBusMessage
中移除了对encoding
的支持。 - 为跨SDK一致性,将
ServiceBusMessage.amqp_message
重命名为ServiceBusMessage.amqp_annotated_message
。 - 现在在
ServiceBusAdministrationClient
中,所有name
参数都精确指定,如queue_name
或rule_name
。 ServiceBusMessage.via_partition_key
不再公开,因为它没有外部用途,目前仍在等待完整的事务实现。如果需要,仍可以在ServiceBusMessage.amqp_annotated_message.annotations
中访问其底层值。- 将
ServiceBusMessage.properties
重命名为ServiceBusMessage.application_properties
,以与服务的术语保持一致。 - 将子客户端(
ServiceBusSender
和ServiceBusReceiver
)的from_connection_string
初始化器设置为内部使用,直到需要。客户端应从根ServiceBusClient
初始化。 ServiceBusMessage.label
已重命名为ServiceBusMessage.subject
。ServiceBusMessage.amqp_annotated_message
的类型已从AMQPMessage
更改为AMQPAnnotatedMessage
。AutoLockRenewer
的timeout
参数已重命名为max_lock_renew_duration
。- 尝试自动续订不可续订的消息(例如,在
ReceiveAndDelete
模式下接收的消息),或在ReceiveAndDelete
接收器上配置自动自动续订,将引发ValueError
。 ServiceBusReceiver.receive_messages
上参数max_message_count
的默认值现在为1
,而不是None
。如果给定的值小于或等于0,将引发ValueError
。
错误修复
- 已更新uAMQP依赖到1.2.12。
- 增加了对Python 3.9的支持。
- 修复了amqp消息的
footer
和delivery_annotation
未编码到输出负载中的问题。
7.0.0b7 (2020-10-05)
破坏性更改
- 将除
ReceiveMode
之外的任何类型作为参数receive_mode
传递现在将抛出TypeError
而不是AttributeError
。 - 管理客户端调用现在仅接受实体名称,而不是同时接受
<Entity>Descriptions
,以减少对正在操作的实体的歧义。如果参数类型不正确(非字符串),将抛出TypeError。 AMQPMessage
(Message.amqp_message
)属性现在是只读的,对这些属性的更改不会反映在底层消息中。这可能会在GA之前发生变化。
7.0.0b6 (2020-09-10)
新功能
renew_lock()
现在返回锁将过期的时间的UTC datetime。receive_deferred_messages()
现在可以接受单个序列号以及序列号列表。- 现在可以连续发送两次消息。
- 与
from_connection_string
方法一起使用的连接字符串现在支持使用SharedAccessSignature
密钥代替sharedaccesskey
和sharedaccesskeyname
,将正确构造的令牌的字符串作为值。 - 通过
Message.amqp_message
公开内部AMQP消息属性(标题、页脚、注释、属性等)。
破坏性更改
- 将
prefetch
重命名为prefetch_count
。 - 将
ReceiveSettleMode
枚举重命名为ReceiveMode
,并将相应的mode
参数重命名为receive_mode
。 retry_total
、retry_backoff_factor
和retry_backoff_max
现在在ServiceBusClient
级别定义,并由从它创建的发送器和接收器继承。- 不再在
azure.servicebus
模块中导出NEXT_AVAILABLE
。一个空的session_id
就足够了。 - 将参数
message_count
重命名为max_message_count
,因为在peek_messages()
和receive_messages()
方法中可能存在的消息更少。 - 将
PeekMessage
重命名为PeekedMessage
。 - 将
get_session_state()
和set_session_state()
分别重命名为get_state()
和set_state()
。 - 将方法
dead_letter()
中的参数description
重命名为error_description
。 - 在
AuthorizationRule
和NamespaceProperties
中,将属性created_time
和modified_time
分别重命名为created_at_utc
和modified_at_utc
。 - 从
SqlRuleFilter
和SqlRuleAction
中移除了参数requires_preprocessing
。 - 从
NamespaceProperties
中移除了属性namespace_type
。 - 将
ServiceBusManagementClient
重命名为ServiceBusAdministrationClient
。 - 尝试在非
Message
、BatchMessage
或Message
列表对象上调用send_messages
,现在将抛出TypeError
而不是ValueError
。 - 发送消息两次将不再导致抛出
MessageAlreadySettled
异常。 ServiceBusClient.close()
现在将关闭派生的发送者和接收者。- 尝试使用不同的连接字符串实体和指定的实体(例如,
queue_name
)初始化发送者或接收者将导致出现AuthenticationError
。 - 从管理实体中移除了
is_anonymous_accessible
。 - 从
create_queue
和QueueProperties
中移除了support_ordering
。 - 从
create_topic
和TopicProperties
中移除了enable_subscription_partitioning
。 - 已移除
get_dead_letter_[queue,subscription]_receiver()
。要连接到死信队列,请使用get_[queue,subscription]_receiver()
提供的sub_queue
参数,该参数的值来自SubQueue
枚举。 - 不再导出
ServiceBusSharedKeyCredential
。 - 将
entity_availability_status
重命名为availability_status
。
7.0.0b5 (2020-08-10)
新功能
- 为 Message、PeekMessage 和 ReceivedMessage 添加了新的属性:
content_type
、correlation_id
、label
、message_id
、reply_to
、reply_to_session_id
和to
。请参阅文档字符串以获取更多信息。 - 为 PeekMessage 和 ReceivedMessage 添加了新的属性:
enqueued_sequence_number
、dead_letter_error_description
、dead_letter_reason
、dead_letter_source
、delivery_count
和expires_at_utc
。请参阅文档字符串以获取更多信息。 - 支持通过
ServiceBusSender.send_messages
发送接收到的消息。 - 为
AutoLockRenew.register
添加了参数on_lock_renew_failure
,它接受一个回调,当锁非故意丢失(例如,不是通过结算、关闭或自动锁续期持续时间完成)时调用。 - 为
CorrelationFilter.properties
添加了新的支持值类型:int、float、datetime 和 timedelta。 - 为
SqlRuleFilter
和SqlRuleAction
添加了新的属性parameters
和requires_preprocessing
。 - 添加了一个显式方法来获取连续接收迭代器,
get_streaming_message_iter()
,可以指定max_wait_time
作为覆盖。
破坏性更改
- 在 Message 上移除/重命名了几个属性和实例变量(这些更改也应用于继承的 Message 类型 PeekMessage 和 ReceivedMessage)。
- 将属性
user_properties
重命名为properties
。- 表示 AMQP 属性的原实例变量
properties
现在成为内部实例变量_amqp_properties
。
- 表示 AMQP 属性的原实例变量
- 移除了属性
enqueue_sequence_number
。 - 移除了属性
annotations
。 - 移除了实例变量
header
。
- 将属性
- 在 PeekMessage 和 ReceivedMessage 上移除了几个属性和实例变量。
- 在两个类型上移除了属性
partition_id
。 - 在两个类型上移除了属性
settled
。 - 在两个类型上移除了实例变量
received_timestamp_utc
。 - 在 PeekMessage 上移除了属性
settled
。 - 在 ReceivedMessage 上移除了属性
expired
。
- 在两个类型上移除了属性
AutoLockRenew.sleep_time
和AutoLockRenew.renew_period
已经被更改为内部变量_sleep_time
和_renew_period
,因为不期望用户需要与其交互。AutoLockRenew.shutdown
现在为AutoLockRenew.close
,以与其他等效行为保持一致。QueueDescription
、TopicDescription
、SubscriptionDescription
和RuleDescription
已重命名为QueueProperties
、TopicProperties
、SubscriptionProperties
和RuleProperties
。QueueRuntimeInfo
、TopicRuntimeInfo
和SubscriptionRuntimeInfo
已重命名为QueueRuntimeProperties
、TopicRuntimeProperties
和SubscriptionRuntimeProperties
。- 已从
ServiceBusManagementClient
的create_queue
、create_topic
、create_subscription
和create_rule
中移除参数queue
、topic
、subscription
和rule
,并添加了name
参数和队列属性、主题属性、订阅属性和规则属性的键控参数。 - 已从
ServiceBusManagementClient
的update_queue
和update_topic
中移除与模型类属性相关的键控参数。这是为了鼓励使用从 create_*、list_* 或 get_* 操作返回的模型类实例,以确保其正确填充。属性仍可修改。 - 模型类
QueueProperties
、TopicProperties
、SubscriptionProperties
和RuleProperties
要求所有参数在创建时都必须存在。这是为了防止由于缺少部分更新而要求指定所有属性。 get_<queue/subscription>_receiver()
中的idle_timeout
已重命名为max_wait_time
,以与其他命名保持一致。- 已更新 uAMQP 依赖项到 1.2.10,这样当生成器超时时,接收器不会关闭,并且可以再次接收。
7.0.0b4 (2020-07-06)
新功能
- 添加了对主题、订阅和规则的管理支持。
receive_messages()
(以前为receive()
)现在支持在无需在ServiceBusReceiver
初始化期间设置prefetch
参数的情况下接收一批消息(max_batch_size
> 1)。
错误修复
- 修复了同步
AutoLockRenew
无法及时关闭的问题。 - 修复了异步
AutoLockRenew
不支持上下文管理器的问题。
破坏性更改
receive()
、peek()
、schedule()
和send()
已重命名为receive_messages()
、peek_messages()
、schedule_messages()
和send_messages()
,以与其他服务总线 SDK 保持一致。- 如果
max_batch_size
小于在ServiceBusReceiver
初始化期间设置的prefetch
参数,则receive_messages()
(以前为receive()
)不再引发ValueError
。
7.0.0b3 (2020-06-08)
新功能
- 添加了对队列实体的管理支持。
- 使用
azure.servicebus.management.ServiceBusManagementClient
(对于 aio 使用azure.servicebus.management.aio.ServiceBusManagementClient
)来创建、更新、删除、列出队列以及获取 ServiceBus 命名空间下队列的设置以及运行时信息。
- 使用
- 在
ServiceBusClient
中添加了get_queue_deadletter_receiver
和get_subscription_deadletter_receiver
方法,以获取目标实体的死信子队列的ServiceBusReceiver
。
错误修复
- 已更新 uAMQP 依赖项到 1.2.8。
- 修复了在死信消息时未设置原因和描述的问题。
7.0.0b2 (2020-05-04)
新功能
- 在
ServiceBusClient
中添加了get_topic_sender
方法,以获取特定主题的ServiceBusSender
。 - 在
ServiceBusClient
中添加了get_subscription_receiver
方法,以获取特定主题下的订阅的ServiceBusReceiver
。 - 添加了对消息调度和已调度消息取消的支持。
- 使用
ServiceBusSender.schedule(messages, schedule_time_utc)
进行消息调度。 - 使用
ServiceBusSender.cancel_scheduled_messages(sequence_numbers)
进行已调度消息取消。
- 使用
- 如果消息适合单个批次,则
ServiceBusSender.send()
可以在单个调用中发送消息列表。如果它们不适合,则抛出ValueError
。 - 如果内容过大,则
BatchMessage.add()
和ServiceBusSender.send()
会引发MessageContentTooLarge
。 ServiceBusReceiver.receive()
方法如果其参数max_batch_size
大于ServiceBusClient
的参数prefetch
,则会引发ValueError
。- 增加了异常类
MessageError
、MessageContentTooLarge
和ServiceBusAuthenticationError
。MessageError
:在发送有问题的消息时,例如已发送的消息或过大的消息。MessageContentTooLarge
:在发送过大的消息时。它是ValueError
和MessageError
的子类。ServiceBusAuthenticationError
:在服务认证失败时。
- 已移除异常类
InvalidHandlerState
。
错误修复
- 修复了
http_proxy
和transport_type
在ServiceBusClient
中未能正确传递到 Sender/Receiver 创建的问题。 - 已将 uAMQP 依赖更新到 1.2.7。
- 修复了在 MacOS 上设置 tlsio 证书的 bug。#7201
- 修复了在 MacOS 上设置
ServiceBusClient
中的logging_enable
为True
时导致的段错误。
破坏性更改
- 会话接收器现在通过其自己的顶级函数创建,例如
get_queue_session_receiver
和get_subscription_session_receiver
。非会话接收器不再将 session_id 作为参数。 ServiceBusSender.send()
不再接受超时参数,因为这与创建客户端时提供的重试选项是冗余的。- 已从模块
azure.servicebus
中移除异常导入。请从azure.servicebus.exceptions
导入。 ServiceBusSender.schedule()
已交换了参数schedule_time_utc
和messages
的顺序,以更好地与send()
语法保持一致。
7.0.0b1 (2020-04-06)
7.0.0b1 是我们努力创建一个用户友好且符合 Python 生态系统的客户端库的预览版。这次更新中大多数更改的原因可以在 Python 的 Azure SDK 设计指南中找到。有关更多信息,请访问 https://aka.ms/azure-sdk-preview1-python。
- 注意:目前此版本中并非所有历史功能都存在。主题、订阅、计划、死信管理等功能将在未来的预览版本中逐步添加。
新功能
- 在创建
ServiceBusClient
时增加了新的配置参数。credential
:用于认证的凭据对象,该对象实现了获取令牌的TokenCredential
接口。http_proxy
:包含代理设置的字典。- 有关配置参数的详细信息,请参阅
ServiceBusClient
中的文档字符串或参考文档。
- 增加了使用 Azure Identity 凭据进行认证的支持。
- 增加了重试策略的支持。
- 增加了对 http 代理的支持。
- 手动调用
reconnect
不再必要,现在它将隐式执行。 - 手动调用
open
不再必要,现在它将隐式执行。- 注意:如果不使用上下文管理器,则仍然需要调用
close()
,以避免连接泄露。
- 注意:如果不使用上下文管理器,则仍然需要调用
- 增加了发送针对异构会话的消息批量的支持。
破坏性更改
- 简化了 API 和客户端集
get_queue
已不存在,请使用get_queue_sender/receiver
代替。peek
和其他queue_client
函数已移动到相应的发送器/接收器。- 将
fetch_next
重命名为receive
。 - 将
session
重命名为session_id
,以在请求给定会话的接收器时统一命名。 reconnect
已不存在,如果需要,将隐式执行。open
已不存在,如果需要,将隐式执行。
- 将顶级客户端参数规范化为惯用和一致的命名。
- 将
ServiceBusClient
初始化器中的debug
重命名为logging_enable
。 - 将
ServiceBusClient
初始化器中的service_namespace
重命名为fully_qualified_namespace
。
- 将
- 新的错误层次结构,具有更具体的语义
azure.servicebus.exceptions.ServiceBusError
azure.servicebus.exceptions.ServiceBusConnectionError
azure.servicebus.exceptions.ServiceBusResourceNotFound
azure.servicebus.exceptions.ServiceBusAuthorizationError
azure.servicebus.exceptions.NoActiveSession
azure.servicebus.exceptions.OperationTimeoutError
azure.servicebus.exceptions.InvalidHandlerState
azure.servicebus.exceptions.AutoLockRenewTimeout
azure.servicebus.exceptions.AutoLockRenewFailed
azure.servicebus.exceptions.EventDataSendError
azure.servicebus.exceptions.MessageSendFailed
azure.servicebus.exceptions.MessageLockExpired
azure.servicebus.exceptions.MessageSettleFailed
azure.servicebus.exceptions.MessageAlreadySettled
azure.servicebus.exceptions.SessionLockExpired
- 现在通过在发送者上的
create_batch
方法启动 BatchMessage 创建,使用批次的add()
方法添加消息,以强制执行服务端最大批次大小限制。 - 现在通过
session_id
参数或属性在消息本身上设置会话,而不是通过Send
或get_sender
上的session
。这是为了允许发送目标为不同会话的消息批。 - 现在将会话管理封装在接收器的属性中,例如
receiver.session
,以更好地隔离特定于会话的功能。- 要针对会话使用
AutoLockRenew
,只需传递内部会话对象,而不是接收器本身。
- 要针对会话使用
0.50.2 (2019-12-09)
新功能
- 增加了对交付标签锁令牌的支持
错误修复
- 修复了在尝试通过主题线程传递时,消息在初始化时通过无效的 kwargs 的错误。
- 将 UAMQP 依赖项的最小版本增加到 1.2.5,包括一系列修复,包括处理大消息和缓解段错误。
0.50.1 (2019-06-24)
错误修复
- 修复了解析消息的 enqueued_time 和 scheduled_enqueue_time 时将其解析为本地时间戳而不是 UTC 的错误。
0.50.0 (2019-01-17)
破坏性更改
- 引入了基于 AMQP 的新 API。
- 原始基于 HTTP 的 API 仍在新的命名空间下可用:azure.servicebus.control_client
- 有关完整的 API 更改,请参阅更新的 参考文档。
在新的命名空间中,版本 0.21.1 的原始基于 HTTP 的 API 保持不变(即没有添加新功能或错误修复),因此对于只想使用 HTTP 操作的用户来说,现在更新没有额外的好处。
新功能
- 新 API 支持通过 AMQP 以改进的性能和稳定性发送和接收消息。
- 提供了用于发送、接收和消息处理的新异步 API(使用
asyncio
)。 - 支持通过后台线程或异步操作自动锁定消息和会话。
- 现在支持计划消息取消。
0.21.1 (2017-04-27)
此 wheel 包现在使用 azure wheel 扩展构建
0.21.0 (2017-01-13)
新功能
str
消息现在在 Python 3 中接受,并将以 'utf-8' 编码(不再会引发 TypeError)broker_properties
现在可以定义为字典,而不仅仅是 JSONstr
。 datetime、int、float 和 boolean 被转换。- #902 添加
send_topic_message_batch
操作(接受消息的可迭代对象) - #902 添加
send_queue_message_batch
操作(接受消息的可迭代对象)
错误修复
- #820 代码现在对 SB RestAPI 的意外更改更具鲁棒性
0.20.3 (2016-08-11)
新闻
- #547 向 Python 添加获取死信路径的静态方法
- #513 添加续订锁
错误修复
- #628 修复了具有双引号的自定义属性
0.20.2 (2016-06-28)
错误修复
- Rest API 中添加了新头,这破坏了 SDK #658 #657
0.20.1 (2015-09-14)
新闻
- 如果用户未传入,则创建一个 requests.Session()
0.20.0 (2015-08-31)
此包的初始版本,来自 azure
包的拆分。有关详细信息以及 Service Bus 的先前历史,请参阅 1.0.0 的 azure
包发行说明。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。