Как с помощью пакета SDK Azure ServiceBus 7.0 получить ссылку на ServiceBusClient с помощью класса ServiceBusManagementClient?

Я использую последнюю версию 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?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
407
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы ответил несколькими вещами, дайте мне знать, если что-то из этого нуждается в разъяснении или не соответствует действительности:

  1. Документ, на который вы ссылаетесь, предназначен не для 7.0.0, а для 0.50.3, что может объяснить некоторую путаницу. Я бы посоветовал использовать документы, основанные на readme , для которых один из документов, сопоставимых с документом, на который вы ссылались, находится здесь. (Процесс замены исторических документов является известной проблемой и решается, полное раскрытие информации в качестве сопровождающего компонента Python SDK)
  2. Я хотел бы отметить, что вы инициализировали ServiceBusManagementClient (который будет использоваться для создания/удаления тем), а не ServiceBusClient (который будет использоваться для отправки и получения). отправить в тему. Я вставлю исчерпывающий пример из этой ссылки внизу этого поста для потомков на случай, если что-то изменится в будущем, что этот пост все еще актуален для версии 7.0.0.
  3. Для аутентификации с использованием учетных данных Azure Identity я бы указал вам на документацию в файле readme здесь и образец, связанный с ним и вставленный ниже.

Пример отправки и получения в тему/подписку

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'))

Во втором примере с «учетными данными» и full_qualified_namespace вы не предоставляете никакой информации объекту EnvironmentCrednetial. Раньше я использовал ServiceBusService, который принимал пространство имен, shared_access_key_name и shared_access_key_value. Как они вписываются в новую парадигму?

Dave 11.12.2020 16:10

Таким образом, EnvironmentCredential немного отличается тем, что пытается найти нужные биты из переменных среды, см. документ здесь. Теперь, когда вы говорите «имя ключа общего доступа», вы говорите что-то очень отличное от вопроса, который вы задали изначально, который имел учетные данные Service Principle (которые поддерживает EnvironmentCredential). С учетом сказанного, если вам нужна аутентификация на основе SAS, вы захотите использовать строку подключения и метод from_connection_string.

Kibrantn 14.12.2020 19:16

Другие вопросы по теме