Я использую последнюю версию Python Azure SDK.
azure-mgmt-servicebus==6.0.0
azure-servicebus==7.0.0
Я получаю ссылку на ServiceBusManagementClient так...
def _get_sb_client(self):
credential = ClientSecretCredential(
tenant_id=self._tenant,
client_id=self._client_id,
client_secret=self._client_secret
)
return ServiceBusManagementClient(
credential, self._subscription)
Однако, согласно этому -- https://learn.microsoft.com/en-us/python/api/overview/azure/servicebus?view=azure-python#service-bus-topics-and-subscriptions, чтобы отправить сообщение по теме,
topic_client = sb_client.get_topic("MyTopic")
Мне нужна ссылка на объект azure.servicebus.ServiceBusClient. Однако документы не дают никаких объяснений того, как сгенерировать такой экземпляр, кроме как через строку подключения, которую мы не используем. Как получить экземпляр ServiceBusClient с помощью экземпляров ClientSecretCredential или ServiceBusManagementClient?
Я бы ответил несколькими вещами, дайте мне знать, если что-то из этого нуждается в разъяснении или не соответствует действительности:
Пример отправки и получения в тему/подписку
from azure.servicebus import ServiceBusClient, ServiceBusMessage
CONNECTION_STR = "<NAMESPACE CONNECTION STRING>"
TOPIC_NAME = "<TOPIC NAME>"
SUBSCRIPTION_NAME = "<SUBSCRIPTION NAME>"
def send_single_message(sender):
message = ServiceBusMessage("Single Message")
sender.send_messages(message)
print("Sent a single message")
def send_a_list_of_messages(sender):
messages = [ServiceBusMessage("Message in list") for _ in range(5)]
sender.send_messages(messages)
print("Sent a list of 5 messages")
def send_batch_message(sender):
batch_message = sender.create_message_batch()
for _ in range(10):
try:
batch_message.add_message(ServiceBusMessage("Message inside a ServiceBusMessageBatch"))
except ValueError:
# ServiceBusMessageBatch object reaches max_size.
# New ServiceBusMessageBatch object can be created here to send more data.
break
sender.send_messages(batch_message)
print("Sent a batch of 10 messages")
servicebus_client = ServiceBusClient.from_connection_string(conn_str=CONNECTION_STR, logging_enable=True)
with servicebus_client:
sender = servicebus_client.get_topic_sender(topic_name=TOPIC_NAME)
with sender:
send_single_message(sender)
send_a_list_of_messages(sender)
send_batch_message(sender)
print("Done sending messages")
print("-----------------------")
with servicebus_client:
receiver = servicebus_client.get_subscription_receiver(topic_name=TOPIC_NAME, subscription_name=SUBSCRIPTION_NAME, max_wait_time=5)
with receiver:
for msg in receiver:
print("Received: " + str(msg))
receiver.complete_message(msg)
Пример аутентификации с помощью Azure Identity
import os
from azure.servicebus import ServiceBusClient, ServiceBusMessage
from azure.identity import EnvironmentCredential
FULLY_QUALIFIED_NAMESPACE = os.environ['SERVICE_BUS_NAMESPACE']
QUEUE_NAME = os.environ["SERVICE_BUS_QUEUE_NAME"]
credential = EnvironmentCredential()
servicebus_client = ServiceBusClient(FULLY_QUALIFIED_NAMESPACE, credential)
with servicebus_client:
sender = servicebus_client.get_queue_sender(queue_name=QUEUE_NAME)
with sender:
sender.send_messages(ServiceBusMessage('Single Message'))
Таким образом, EnvironmentCredential немного отличается тем, что пытается найти нужные биты из переменных среды, см. документ здесь. Теперь, когда вы говорите «имя ключа общего доступа», вы говорите что-то очень отличное от вопроса, который вы задали изначально, который имел учетные данные Service Principle (которые поддерживает EnvironmentCredential). С учетом сказанного, если вам нужна аутентификация на основе SAS, вы захотите использовать строку подключения и метод from_connection_string
.
Во втором примере с «учетными данными» и full_qualified_namespace вы не предоставляете никакой информации объекту EnvironmentCrednetial. Раньше я использовал ServiceBusService, который принимал пространство имен, shared_access_key_name и shared_access_key_value. Как они вписываются в новую парадигму?