libreria client bus di servizio di Azure per Python - versione 7.11.4
bus di servizio di Azure è un servizio di messaggistica gestito dal cloud ad alte prestazioni per fornire comunicazioni in tempo reale e a tolleranza di errore tra mittenti e ricevitori distribuiti.
Il bus di servizio offre più meccanismi per la comunicazione a elevata affidabilità asincrona, ad esempio la messaggistica first-in-first-out strutturata, le funzionalità di pubblicazione/sottoscrizione e la possibilità di ridimensionare facilmente in base alle esigenze.
Usare la libreria client del bus di servizio per Python per comunicare tra applicazioni e servizi e implementare modelli di messaggistica asincroni.
- Creare spazi dei nomi, code, argomenti e sottoscrizioni del bus di servizio e modificarne le impostazioni.
- Inviare e ricevere messaggi all'interno dei canali del bus di servizio.
- Utilizzare blocchi, sessioni e funzionalità di messaggi non recapitabili per implementare modelli di messaggistica complessi.
Codice | sorgentePacchetto (PyPi) | Pacchetto (Conda) | Documentazione | di riferimento sulle APIDocumentazione | del prodottoCampioni | Changelog
NOTA: se si usa la versione 0.50 o una versione precedente e si vuole eseguire la migrazione alla versione più recente di questo pacchetto, vedere la guida alla migrazione per passare dal bus di servizio V0.50 alla versione 7 del bus di servizio.
Introduzione
Installare il pacchetto
Installare la libreria client bus di servizio di Azure per Python con pip:
pip install azure-servicebus
Prerequisiti:
Per usare questo pacchetto, è necessario disporre di:
- Sottoscrizione di Azure. Creare un account gratuito
- bus di servizio di Azure - Credenziali di gestione e spazio dei nomi
- Python 3.7 o versione successiva - Installare Python
Se è necessario uno spazio dei nomi del bus di servizio di Azure, è possibile crearlo tramite il portale di Azure. Se non si vuole usare l'interfaccia utente del portale grafico, è possibile usare l'interfaccia della riga di comando di Azure tramite Cloud Shell o l'interfaccia della riga di comando di Azure viene eseguita in locale per crearne una con questo comando dell'interfaccia della riga di comando di Azure:
az servicebus namespace create --resource-group <resource-group-name> --name <servicebus-namespace-name> --location <servicebus-namespace-location>
Autenticare il client
L'interazione con il bus di servizio inizia con un'istanza della ServiceBusClient
classe . Per creare un'istanza dell'oggetto client, è necessario un stringa di connessione con chiave di firma di accesso condiviso o uno spazio dei nomi e una delle relative chiavi dell'account.
Per una dimostrazione su come eseguire l'autenticazione tramite uno dei due approcci, vedere gli esempi collegati di seguito.
Creare un client da stringa di connessione
- Per ottenere le credenziali necessarie, è possibile usare il frammento di interfaccia della riga di comando di Azure (formattato per la shell Bash) nella parte superiore dell'esempio collegato per popolare una variabile di ambiente con il stringa di connessione del bus di servizio (è anche possibile trovare questi valori nel portale di Azure seguendo la guida dettagliata per Ottenere un bus di servizio stringa di connessione).
Creare un client usando la libreria azure-identity:
- Questo costruttore accetta lo spazio dei nomi completo dell'istanza del bus di servizio e una credenziale che implementa il protocollo TokenCredential . Nel pacchetto azure-identity sono disponibili implementazioni del
TokenCredential
protocollo. Lo spazio dei nomi completo è del formato<yournamespace.servicebus.windows.net>
. - Per usare i tipi di credenziali forniti da
azure-identity
, installare il pacchetto:pip install azure-identity
- Inoltre, per usare l'API asincrona, è prima necessario installare un trasporto asincrono, ad esempio
aiohttp
:pip install aiohttp
- Quando si usa Azure Active Directory, all'entità deve essere assegnato un ruolo che consente l'accesso al bus di servizio, ad esempio il ruolo proprietario dei dati bus di servizio di Azure. Per altre informazioni sull'uso dell'autorizzazione di Azure Active Directory con il bus di servizio, vedere la documentazione associata.
Nota: il client può essere inizializzato senza un gestore del contesto, ma deve essere chiuso manualmente tramite client.close() per non perdere risorse.
Concetti chiave
Dopo aver inizializzato un ServiceBusClient
oggetto , è possibile interagire con i tipi di risorse primari all'interno di uno spazio dei nomi del bus di servizio, di cui possono esistere più e su cui avviene la trasmissione effettiva dei messaggi, lo spazio dei nomi viene spesso usato come contenitore dell'applicazione:
Coda: consente l'invio e la ricezione di messaggi. Spesso usato per la comunicazione da punto a punto.
Argomento: a differenza delle code, gli argomenti sono più adatti per gli scenari di pubblicazione/sottoscrizione. Un argomento può essere inviato a , ma richiede una sottoscrizione, di cui possono essere presenti più in parallelo, da utilizzare.
Sottoscrizione: meccanismo da utilizzare da un argomento. Ogni sottoscrizione è indipendente e riceve una copia di ogni messaggio inviato all'argomento. Le regole e i filtri possono essere usati per personalizzare i messaggi ricevuti da una sottoscrizione specifica.
Per altre informazioni su queste risorse, vedere Che cos'è bus di servizio di Azure?.
Per interagire con queste risorse, è necessario avere familiarità con i concetti dell'SDK seguenti:
ServiceBusClient: si tratta dell'oggetto che un utente deve prima inizializzare per connettersi a uno spazio dei nomi del bus di servizio. Per interagire con una coda, un argomento o una sottoscrizione, è necessario generare un mittente o un destinatario da questo client.
ServiceBusSender: per inviare messaggi a una coda o a un argomento, usare il metodo o
get_topic_sender
corrispondenteget_queue_sender
all'esterno di un'istanzaServiceBusClient
come illustrato di seguito.ServiceBusReceiver: per ricevere messaggi da una coda o una sottoscrizione, usare il metodo o
get_subscription_receiver
corrispondenteget_queue_receiver
all'esterno di un'istanzaServiceBusClient
, come illustrato di seguito.ServiceBusMessage: durante l'invio, questo è il tipo che verrà costruito per contenere il payload. Quando si riceve, questo è il percorso in cui si accederà al payload.
Thread safety
Microsoft non garantisce che ServiceBusClient, ServiceBusSender e ServiceBusReceiver siano thread-safe. Non è consigliabile riutilizzare queste istanze tra thread. Spetta all'applicazione in esecuzione usare queste classi in modo thread-safe.
Esempio
Le sezioni seguenti forniscono diversi frammenti di codice che illustrano alcune delle attività più comuni del bus di servizio, tra cui:
- Inviare messaggi a una coda
- Ricevere messaggi da una coda
- Inviare e ricevere un messaggio da una coda abilitata per la sessione
- Utilizzo di argomenti e sottoscrizioni
- Risolvere un messaggio dopo la ricevuta
- Rinnovare automaticamente i blocchi di messaggio o sessione
Per eseguire attività di gestione come la creazione e l'eliminazione di code/argomenti/sottoscrizioni, usare la libreria azure-mgmt-servicebus, disponibile qui.
Per altri esempi, vedere la directory degli esempi che illustra gli scenari comuni del bus di servizio, ad esempio l'invio, la ricezione, la gestione delle sessioni e la gestione dei messaggi.
Inviare messaggi a una coda
NOTA: vedere la documentazione di riferimento qui.
Questo esempio invia un singolo messaggio e una matrice di messaggi a una coda che si presuppone esista già, creata tramite i comandi portale di Azure o az.
from azure.servicebus import ServiceBusClient, ServiceBusMessage
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) 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)
NOTA: Un messaggio può essere pianificato per il recapito ritardato usando il
ServiceBusSender.schedule_messages()
metodo oppure specificandoServiceBusMessage.scheduled_enqueue_time_utc
prima di chiamareServiceBusSender.send_messages()
Per altri dettagli sulla pianificazione e la pianificazione dell'annullamento, vedere un esempio qui.
Ricevere messaggi da una coda
Per ricevere da una coda, è possibile eseguire una ricezione ad hoc tramite receiver.receive_messages()
o ricevere in modo permanente tramite il ricevitore stesso.
Ricevere messaggi da una coda tramite iterazione su ServiceBusReceiver
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) 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.
NOTA: Qualsiasi messaggio ricevuto con
receive_mode=PEEK_LOCK
(si tratta dell'impostazione predefinita, con l'alternativa RECEIVE_AND_DELETE la rimozione del messaggio dalla coda immediatamente alla ricezione) ha un blocco che deve essere rinnovato tramitereceiver.renew_message_lock
prima della scadenza se l'elaborazione richiederebbe più tempo della durata del blocco. Per un helper per eseguire questa operazione in background in background, vedere . La durata del blocco viene impostata in Azure nella coda o nell'argomento stesso.
Ricevere messaggi da una coda tramite ServiceBusReceiver.receive_messages()
NOTA:
ServiceBusReceiver.receive_messages()
riceve un singolo elenco o vincolato di messaggi tramite una chiamata al metodo ad hoc, anziché ricevere in modo perpetuo dal generatore. Restituisce sempre un elenco.
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) 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))
In questo esempio, max_message_count dichiara il numero massimo di messaggi da tentare di ricevere prima di raggiungere un max_wait_time come specificato in secondi.
NOTA: Va inoltre notato che
ServiceBusReceiver.peek_messages()
è leggermente diverso dalla ricezione, in quanto non blocca i messaggi visualizzati, e quindi non possono essere risolti.
Inviare e ricevere un messaggio da una coda abilitata per la sessione
NOTA: vedere la documentazione di riferimento per l'invio e la ricezione della sessione.
Le sessioni forniscono semantica first-in-first-out e a ricevitore singolo sopra una coda o una sottoscrizione. Mentre la sintassi di ricezione effettiva è la stessa, l'inizializzazione è leggermente diversa.
from azure.servicebus import ServiceBusClient, ServiceBusMessage
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_SESSION_QUEUE_NAME']
session_id = os.environ['SERVICE_BUS_SESSION_ID']
with ServiceBusClient.from_connection_string(connstr) 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))
NOTA: i messaggi ricevuti da una sessione non richiedono che i blocchi vengano rinnovati come un ricevitore non di sessione; Al contrario, la gestione dei blocchi si verifica a livello di sessione con un blocco di sessione che può essere rinnovato con
receiver.session.renew_lock()
Utilizzo di argomenti e sottoscrizioni
NOTA: vedere la documentazione di riferimento per argomenti e sottoscrizioni.
Argomenti e sottoscrizioni offrono un'alternativa alle code per l'invio e la ricezione di messaggi. Per altre informazioni dettagliate, vedere i documenti e il modo in cui questi elementi differiscono dalle code.
from azure.servicebus import ServiceBusClient, ServiceBusMessage
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
topic_name = os.environ['SERVICE_BUS_TOPIC_NAME']
subscription_name = os.environ['SERVICE_BUS_SUBSCRIPTION_NAME']
with ServiceBusClient.from_connection_string(connstr) 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))
Risolvere un messaggio dopo la ricevuta
Quando si riceve da una coda, sono disponibili più azioni che è possibile eseguire sui messaggi ricevuti.
NOTA: è possibile regolare
ServiceBusReceivedMessage
solo gli oggetti ricevuti inServiceBusReceiveMode.PEEK_LOCK
modalità (impostazione predefinita).ServiceBusReceiveMode.RECEIVE_AND_DELETE
mode rimuove il messaggio dalla coda alla ricezione.ServiceBusReceivedMessage
i messaggi restituiti dapeek_messages()
non possono essere risolti, perché il blocco del messaggio non viene preso come nel metodo di ricezione menzionato in precedenza.
Se il messaggio ha un blocco come indicato in precedenza, il regolamento avrà esito negativo se il blocco del messaggio è scaduto.
Se l'elaborazione richiederebbe più tempo della durata del blocco, deve essere mantenuta tramite receiver.renew_message_lock
prima della scadenza.
La durata del blocco viene impostata in Azure nella coda o nell'argomento stesso.
Per un helper per eseguire questa operazione in background in background, vedere .
Operazione completata
Dichiara che l'elaborazione dei messaggi deve essere completata correttamente, rimuovendo il messaggio dalla coda.
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.complete_message(msg)
Abbandonare
Abbandonare l'elaborazione del messaggio per il momento, restituendo immediatamente il messaggio alla coda per essere prelevato da un altro ricevitore (o lo stesso).
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.abandon_message(msg)
DeadLetter
Trasferire il messaggio dalla coda primaria in una speciale "coda secondaria di messaggi non recapitabili" in cui è possibile accedervi usando la ServiceBusClient.get_<queue|subscription>_receiver
funzione con il parametro sub_queue=ServiceBusSubQueue.DEAD_LETTER
e utilizzato da come qualsiasi altro ricevitore. (vedere qui l'esempio)
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.dead_letter_message(msg)
Rinviare
Il rinvio è leggermente diverso dai metodi di liquidazione precedenti. Impedisce che il messaggio venga ricevuto direttamente dalla coda impostandolo su di esso in modo che debba essere ricevuto dal numero di sequenza in una chiamata a ServiceBusReceiver.receive_deferred_messages
(vedere qui l'esempio)
from azure.servicebus import ServiceBusClient
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connstr) as client:
with client.get_queue_receiver(queue_name) as receiver:
for msg in receiver:
print(str(msg))
receiver.defer_message(msg)
Rinnovare automaticamente i blocchi di messaggio o sessione
NOTA: vedere la documentazione di riferimento per il rinnovo automatico del blocco.
AutoLockRenewer
è un metodo semplice per garantire che il messaggio o la sessione rimanga bloccato anche per lunghi periodi di tempo, se la chiamata receiver.renew_message_lock
/receiver.session.renew_lock
è poco pratica o indesiderata.
Internamente, non è molto più breve per creare un watchdog simultaneo per eseguire il rinnovo del blocco se l'oggetto sta per scadere.
Deve essere usato come segue:
- Rinnovo automatico del blocco dei messaggi
from azure.servicebus import ServiceBusClient, AutoLockRenewer
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
# Can also be called via "with AutoLockRenewer() as renewer" to automate closing.
renewer = AutoLockRenewer()
with ServiceBusClient.from_connection_string(connstr) 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()
- Rinnovo automatico blocco sessione
from azure.servicebus import ServiceBusClient, AutoLockRenewer
import os
connstr = os.environ['SERVICE_BUS_CONNECTION_STR']
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()
with ServiceBusClient.from_connection_string(connstr) 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()
Se per qualsiasi motivo il rinnovo automatico è stato interrotto o non è riuscito, è possibile osservare questa situazione tramite la auto_renew_error
proprietà sull'oggetto da rinnovare oppure passando un callback al parametro all'inizializzazione del on_lock_renew_failure
rinnovo.
Si manifesterebbe anche quando si tenta di eseguire un'azione (ad esempio il completamento di un messaggio) sull'oggetto specificato.
Risoluzione dei problemi
Registrazione
- Abilitare
azure.servicebus
il logger per raccogliere tracce dalla libreria. - Abilitare
uamqp
il logger per raccogliere tracce dalla libreria uAMQP sottostante. - Abilitare la traccia a livello di frame AMQP impostando
logging_enable=True
durante la creazione del client. - In alcuni casi è possibile considerare la
uamqp
registrazione troppo dettagliata. Per eliminare la registrazione non necessaria, aggiungere il frammento di codice seguente all'inizio del codice:
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)
Timeout
Esistono diversi timeout di cui un utente deve essere a conoscenza all'interno della libreria.
- Chiusura del collegamento sul lato servizio di 10 minuti: un collegamento, una volta aperto, verrà chiuso dopo 10 minuti di inattività per proteggere il servizio da perdite di risorse. Questo dovrebbe essere in gran parte trasparente per un utente, ma se si nota una riconnessione che si verifica dopo tale durata, questo è il motivo. L'esecuzione di tutte le operazioni, incluse le operazioni di gestione, nel collegamento estenderà questo timeout.
- max_wait_time: fornito durante la creazione di un ricevitore o quando si chiama
receive_messages()
, l'ora dopo la quale la ricezione dei messaggi verrà interrotta dopo nessun traffico. Questo vale sia per la funzione imperativareceive_messages()
che per la lunghezza per cui verrà eseguita una ricezione in stile generatore prima di uscire se non sono presenti messaggi. Il passaggio di Nessuna (impostazione predefinita) attenderà per sempre, fino alla soglia di 10 minuti se non viene eseguita alcuna altra azione.
NOTA: Se l'elaborazione di un messaggio o di una sessione è sufficientemente lunga da causare timeout, in alternativa alla chiamata
receiver.renew_message_lock
/receiver.session.renew_lock
manuale, è possibile sfruttare laAutoLockRenewer
funzionalità dettagliata Rinnovare sopra.
Eccezioni comuni
Le API del bus di servizio generano le eccezioni seguenti in azure.servicebus.exceptions:
- ServiceBusConnectionError: Si è verificato un errore nella connessione al servizio. Questo problema potrebbe essere stato causato da un problema di rete o di servizio temporaneo. È consigliabile riprovare.
- ServiceBusAuthorizationError: Errore durante l'autorizzazione della connessione al servizio. Ciò potrebbe essere dovuto al fatto che le credenziali non dispongono dell'autorizzazione corretta per eseguire l'operazione. È consigliabile controllare l'autorizzazione delle credenziali.
- ServiceBusAuthenticationError: Errore durante l'autenticazione della connessione al servizio. Ciò potrebbe essere stato causato dall'errore delle credenziali. È consigliabile controllare le credenziali.
- OperationTimeoutError: Ciò indica che il servizio non ha risposto a un'operazione entro il periodo di tempo previsto. Questo problema potrebbe essere stato causato da un problema di rete o di servizio temporaneo. Il servizio può o non aver completato correttamente la richiesta; lo stato non è noto. È consigliabile tentare di verificare lo stato corrente e riprovare, se necessario.
- MessageSizeExceededError: Ciò indica che il contenuto del messaggio è maggiore delle dimensioni del frame del bus di servizio.
Ciò può verificarsi quando un numero eccessivo di messaggi del bus di servizio viene inviato in un batch o il contenuto passato nel corpo di un
Message
oggetto è troppo grande. È consigliabile ridurre il numero di messaggi inviati in un batch o le dimensioni del contenuto passato in un singoloServiceBusMessage
oggetto . - MessageAlreadySettled: Indica che non è possibile risolvere il messaggio. Questo problema può verificarsi quando si tenta di risolvere un messaggio già risolto.
- MessageLockLostError: Il blocco sul messaggio è scaduto ed è stato rilasciato di nuovo alla coda.
Dovrà essere ricevuto di nuovo per stabilirlo.
È necessario essere consapevoli della durata del blocco di un messaggio e continuare a rinnovare il blocco prima della scadenza in caso di tempo di elaborazione prolungato.
AutoLockRenewer
potrebbe contribuire a mantenere il blocco del messaggio rinnovato automaticamente. - SessionLockLostError: Il blocco della sessione è scaduto.
Non è più possibile risolvere tutti i messaggi non risolti che sono stati ricevuti.
Se necessario, è consigliabile riconnettersi alla sessione.
È necessario tenere presente la durata del blocco di una sessione e continuare a rinnovare il blocco prima della scadenza in caso di tempo di elaborazione prolungato.
AutoLockRenewer
potrebbe contribuire a mantenere il blocco della sessione rinnovata automaticamente. - MessageNotFoundError: Tentare di ricevere un messaggio con un determinato numero di sequenza. Questo messaggio non viene trovato. Assicurarsi che il messaggio non sia già stato ricevuto. Controllare la coda dei messaggi non recapitabili per verificare che il messaggio non si trovi al suo interno.
- MessagingEntityNotFoundError: L'entità associata all'operazione non esiste o è stata eliminata. Assicurarsi che l'entità esista.
- MessagingEntityDisabledError: Richiedere un'operazione di runtime su un'entità disabilitata. Attivare l'entità.
- ServiceBusQuotaExceededError: L'entità di messaggistica ha raggiunto le dimensioni massime consentite oppure è stato superato il numero massimo di connessioni a uno spazio dei nomi. Creare spazio nell'entità mediante la ricezione di messaggi dall'entità o dalle relative code secondarie.
- ServiceBusServerBusyError: Il servizio non è in grado di elaborare la richiesta in questo momento. Il client può attendere per un certo periodo di tempo ed è quindi opportuno ripetere l'operazione.
- ServiceBusCommunicationError: Il client non è in grado di stabilire una connessione al bus di servizio. Assicurarsi che il nome host fornito sia corretto e l'host sia raggiungibile. Se il codice viene eseguito in un ambiente con un firewall/proxy, assicurarsi che il traffico verso il dominio/l'indirizzo IP del bus di servizio e le porte non sia bloccato.
- SessionCannotBeLockedError: Tentare di connettersi a una sessione con un ID di sessione specifico, ma la sessione è attualmente bloccata da un altro client. Assicurarsi che la sessione venga sbloccata dagli altri client.
- AutoLockRenewFailed: Tentativo di rinnovo di un blocco su un messaggio o una sessione in background non riuscito.
Ciò può verificarsi quando il ricevitore utilizzato da
AutoLockRenewer
viene chiuso o il blocco delle rinnovabili è scaduto. È consigliabile registrare nuovamente il messaggio o la sessione rinnovabile ricevendo il messaggio o connettendosi di nuovo all'entità con sessione. - AutoLockRenewTimeout: Il tempo allocato per rinnovare il messaggio o il blocco di sessione è trascorso. È possibile registrare nuovamente l'oggetto che vuole essere rinnovato automaticamente o estendere il timeout in anticipo.
- ServiceBusError: Tutti gli altri errori correlati al bus di servizio. Si tratta della classe di errore radice di tutti gli errori descritti in precedenza.
Per una descrizione dettagliata dei tipi di eccezioni comuni, vedere la documentazione di riferimento sulle eccezioni .
Passaggi successivi
Altro codice di esempio
Per altri esempi, vedere la directory degli esempi che illustra gli scenari comuni del bus di servizio, ad esempio l'invio, la ricezione, la gestione delle sessioni e la gestione dei messaggi.
Documentazione aggiuntiva
Per una documentazione più completa sul servizio del bus di servizio, vedere la documentazione del bus di servizio su docs.microsoft.com.
Funzionalità e documentazione di gestione
Per gli utenti che cercano di eseguire operazioni di gestione su ServiceBus (Creazione di una coda,argomento/e così via, modifica delle regole di filtro, enumerazione delle entità) vedere la documentazione di azure-mgmt-servicebus per la documentazione dell'API. Gli esempi di utilizzo di Terse sono disponibili anche qui .
Supporto per il trasporto AMQP python puro e la compatibilità con le versioni precedenti
La libreria client bus di servizio di Azure è ora basata su un'implementazione AMQP python pura. uAMQP
è stato rimosso in base alle dipendenze necessarie.
Per usare uAMQP
come trasporto sottostante:
- Installare
uamqp
con pip.
$ pip install uamqp
- Passare
uamqp_transport=True
durante la costruzione del client.
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
)
Nota: l'attributo inServiceBusMessageBatch
ServiceBusMessage
//ServiceBusReceivedMessage
, che in precedenza ha esposto l'oggetto message
uamqp.Message
, è stato deprecato.
Gli oggetti "Legacy" restituiti dall'attributo message
sono stati introdotti per facilitare la transizione.
Creazione della ruota uAMQP dall'origine
azure-servicebus
dipende dall'implementazione del protocollo AMQP uAMQP .
Le ruote uAMQP sono disponibili per la maggior parte dei sistemi operativi principali e verranno installati automaticamente durante l'installazione azure-servicebus
di .
Se uAMQP è destinato a essere usato come implementazione del protocollo AMQP sottostante per , è possibile trovare ruote uAMQP per azure-servicebus
la maggior parte dei sistemi operativi principali.
Se si esegue su una piattaforma per cui non sono disponibili ruote uAMQP, seguire Se si intende usare uAMQP
e si sta eseguendo su una piattaforma per cui non sono disponibili ruote uAMQP, seguire le indicazioni per l'installazione uAMQP da origine.
Contributo
In questo progetto sono benvenuti i contributi e i suggerimenti. Per la maggior parte dei contenuti è necessario sottoscrivere un contratto di licenza di collaborazione (CLA, Contributor License Agreement) che stabilisce che l'utente ha il diritto di concedere, e di fatto concede a Microsoft i diritti d'uso del suo contributo. Per informazioni dettagliate, vedere https://cla.microsoft.com.
Quando si invia una richiesta pull, un bot CLA determina automaticamente se è necessario specificare un contratto CLA e completare la richiesta pull in modo appropriato (ad esempio con un'etichetta e un commento). Seguire le istruzioni specificate dal bot. È sufficiente eseguire questa operazione una sola volta per tutti i repository che usano il contratto CLA Microsoft.
Questo progetto ha adottato il Codice di comportamento di Microsoft per l'open source. Per altre informazioni, vedere Code of Conduct FAQ (Domande frequenti sul Codice di comportamento Open Source di Microsoft) oppure contattare opencode@microsoft.com per eventuali altre domande o commenti.
Azure SDK for Python
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per