Azure Service Bus clientbibliotheek voor Python - versie 7.11.4
Azure Service Bus is een krachtige, in de cloud beheerde berichtenservice voor realtime en fouttolerante communicatie tussen gedistribueerde afzenders en ontvangers.
Service Bus biedt meerdere mechanismen voor asynchrone zeer betrouwbare communicatie, zoals gestructureerde first-in-first-out-berichten, mogelijkheden voor publiceren/abonneren en de mogelijkheid om eenvoudig te schalen naarmate uw behoeften toenemen.
Gebruik de Service Bus-clientbibliotheek voor Python om te communiceren tussen toepassingen en services en om asynchrone berichtpatronen te implementeren.
- Maak Service Bus-naamruimten, wachtrijen, onderwerpen en abonnementen en wijzig de instellingen.
- Berichten verzenden en ontvangen binnen uw Service Bus-kanalen.
- Gebruik berichtvergrendelingen, sessies en functionaliteit voor onbestelbare berichten om complexe berichtpatronen te implementeren.
Broncode | Pakket (PyPi) | Pakket (Conda) | API-referentiedocumentatie | Productdocumentatie | Monsters | Changelog
OPMERKING: als u versie 0.50 of lager gebruikt en wilt migreren naar de nieuwste versie van dit pakket, raadpleegt u onze migratiehandleiding om over te stappen van Service Bus V0.50 naar Service Bus V7.
Aan de slag
Het pakket installeren
Installeer de Azure Service Bus-clientbibliotheek voor Python met pip:
pip install azure-servicebus
Vereisten:
Als u dit pakket wilt gebruiken, hebt u het volgende nodig:
- Azure-abonnement: maak een gratis account
- Azure Service Bus - Naamruimte en beheerreferenties
- Python 3.7 of hoger - Python installeren
Als u een Azure Service Bus-naamruimte nodig hebt, kunt u deze maken via Azure Portal. Als u de gebruikersinterface van de grafische portal niet wilt gebruiken, kunt u de Azure CLI gebruiken via Cloud Shell, of Azure CLI lokaal uitvoeren, om er een te maken met deze Azure CLI-opdracht:
az servicebus namespace create --resource-group <resource-group-name> --name <servicebus-namespace-name> --location <servicebus-namespace-location>
De client verifiëren
Interactie met Service Bus begint met een exemplaar van de ServiceBusClient
klasse. U hebt een verbindingsreeks met SAS-sleutel of een naamruimte en een van de accountsleutels nodig om het clientobject te instantiëren.
Hieronder vindt u de voorbeelden die zijn gekoppeld om te laten zien hoe u zich kunt verifiëren via een van beide methoden.
Client maken op basis van verbindingsreeks
- Als u de vereiste referenties wilt verkrijgen, kunt u het Azure CLI-fragment (Formatted for Bash Shell) bovenaan het gekoppelde voorbeeld gebruiken om een omgevingsvariabele te vullen met de Service Bus-verbindingsreeks (u kunt deze waarden ook vinden in Azure Portal door de stapsgewijze handleiding voor Een Service Bus-verbindingsreeks ophalen te volgen).
Maak een client met behulp van de azure-identity-bibliotheek:
- Deze constructor gebruikt de volledig gekwalificeerde naamruimte van uw Service Bus-exemplaar en een referentie waarmee het TokenCredential-protocol wordt geïmplementeerd. Er zijn implementaties van het
TokenCredential
protocol beschikbaar in het azure-identity-pakket. De volledig gekwalificeerde naamruimte heeft de indeling<yournamespace.servicebus.windows.net>
. - Als u de referentietypen wilt gebruiken die worden geleverd door
azure-identity
, installeert u het pakket:pip install azure-identity
- Als u de asynchrone API wilt gebruiken, moet u bovendien eerst een asynchroon transport installeren, zoals
aiohttp
:pip install aiohttp
- Wanneer u Azure Active Directory gebruikt, moet aan uw principal een rol worden toegewezen die toegang tot Service Bus toestaat, zoals de rol Azure Service Bus Gegevenseigenaar. Raadpleeg de bijbehorende documentatie voor meer informatie over het gebruik van Azure Active Directory-autorisatie met Service Bus.
Opmerking: de client kan worden geïnitialiseerd zonder contextbeheerder, maar moet handmatig worden gesloten via client.close() om resources niet te lekken.
Belangrijkste concepten
Zodra u een ServiceBusClient
hebt geïnitialiseerd, kunt u communiceren met de primaire resourcetypen in een Service Bus-naamruimte, waarvan er meerdere kunnen bestaan en waarop de daadwerkelijke berichtoverdracht plaatsvindt. De naamruimte fungeert vaak als een toepassingscontainer:
Wachtrij: hiermee kunt u berichten verzenden en ontvangen. Vaak gebruikt voor punt-naar-punt-communicatie.
Onderwerp: In tegenstelling tot wachtrijen zijn onderwerpen beter geschikt voor scenario's voor publiceren/abonneren. Een onderwerp kan worden verzonden naar, maar vereist een abonnement, waarvan er meerdere parallel kunnen zijn, waaruit kan worden verbruikt.
Abonnement: het mechanisme om te gebruiken vanuit een onderwerp. Elk abonnement is onafhankelijk en ontvangt een kopie van elk bericht dat naar het onderwerp wordt verzonden. Regels en filters kunnen worden gebruikt om aan te passen welke berichten worden ontvangen door een specifiek abonnement.
Zie Wat is Azure Service Bus? voor meer informatie over deze resources.
Als u met deze resources wilt werken, moet u bekend zijn met de volgende SDK-concepten:
ServiceBusClient: dit is het object dat een gebruiker eerst moet initialiseren om verbinding te maken met een Service Bus-naamruimte. Als u wilt communiceren met een wachtrij, onderwerp of abonnement, wordt een afzender of ontvanger van deze client opgehaald.
ServiceBusSender: als u berichten naar een wachtrij of onderwerp wilt verzenden, gebruikt u de bijbehorende
get_queue_sender
methode ofget_topic_sender
uit eenServiceBusClient
exemplaar, zoals hier wordt weergegeven.ServiceBusReceiver: als u berichten van een wachtrij of abonnement wilt ontvangen, gebruikt u de bijbehorende
get_queue_receiver
methode ofget_subscription_receiver
uit eenServiceBusClient
exemplaar, zoals hier wordt weergegeven.ServiceBusMessage: tijdens het verzenden is dit het type dat u gaat maken om uw nettolading te bevatten. Bij ontvangst hebt u hier toegang tot de nettolading.
Veiligheid van schroefdraad
We kunnen niet garanderen dat de ServiceBusClient, ServiceBusSender en ServiceBusReceiver thread-veilig zijn. Het wordt afgeraden om deze exemplaren opnieuw te gebruiken in verschillende threads. Het is aan de actieve toepassing om deze klassen op een thread-veilige manier te gebruiken.
Voorbeelden
De volgende secties bevatten verschillende codefragmenten die betrekking hebben op enkele van de meest voorkomende Service Bus-taken, waaronder:
- Berichten verzenden naar een wachtrij
- Berichten ontvangen uit een wachtrij
- Een bericht verzenden en ontvangen vanuit een wachtrij met sessie ingeschakeld
- Werken met onderwerpen en abonnementen
- Een bericht vereffenen na ontvangst
- Bericht- of sessievergrendelingen automatisch vernieuwen
Als u beheertaken wilt uitvoeren, zoals het maken en verwijderen van wachtrijen/onderwerpen/abonnementen, gebruikt u de azure-mgmt-servicebus-bibliotheek, die hier beschikbaar is.
In de map met voorbeelden vindt u meer voorbeelden waarin veelvoorkomende Service Bus-scenario's worden gedemonstreerd, zoals verzenden, ontvangen, sessiebeheer en berichtafhandeling.
Berichten verzenden naar een wachtrij
OPMERKING: raadpleeg de referentiedocumentatie hier.
In dit voorbeeld wordt één bericht en een matrix met berichten verzonden naar een wachtrij waarvan wordt aangenomen dat deze al bestaat, die is gemaakt via de opdrachten Azure Portal of 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)
OPMERKING: Een bericht kan worden gepland voor vertraagde bezorging met behulp van de
ServiceBusSender.schedule_messages()
methode of door op te geven voordat u aanroeptServiceBusMessage.scheduled_enqueue_time_utc
ServiceBusSender.send_messages()
Bekijk hier een voorbeeld voor meer informatie over het plannen en annuleren van de planning.
Berichten van een wachtrij ontvangen
Als u wilt ontvangen vanuit een wachtrij, kunt u een ad-hoc ontvangst uitvoeren via receiver.receive_messages()
of permanent ontvangen via de ontvanger zelf.
Berichten ontvangen van een wachtrij via itereren via 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.
OPMERKING: Elk bericht dat wordt ontvangen met
receive_mode=PEEK_LOCK
(dit is de standaardinstelling, met de alternatieve RECEIVE_AND_DELETE het bericht onmiddellijk na ontvangst uit de wachtrij te verwijderen) heeft een vergrendeling die moet worden vernieuwd viareceiver.renew_message_lock
voordat het verloopt als de verwerking langer duurt dan de vergrendelingsduur. Zie AutoLockRenewer voor een helper om dit automatisch op de achtergrond uit te voeren. De vergrendelingsduur wordt in Azure ingesteld voor de wachtrij of het onderwerp zelf.
Berichten ontvangen van een wachtrij via ServiceBusReceiver.receive_messages()
OPMERKING:
ServiceBusReceiver.receive_messages()
ontvangt een enkele of beperkte lijst met berichten via een ad-hoc methodeaanroep, in plaats van permanent ontvangen van de generator. Er wordt altijd een lijst geretourneerd.
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 dit voorbeeld declareert max_message_count het maximum aantal berichten dat moet worden ontvangen voordat een max_wait_time wordt bereikt, zoals opgegeven in seconden.
OPMERKING: Er moet ook worden opgemerkt dat
ServiceBusReceiver.peek_messages()
subtiel anders is dan ontvangen, omdat het de berichten die worden bekeken niet vergrendelt en ze dus niet kunnen worden opgelost.
Een bericht verzenden en ontvangen vanuit een wachtrij met sessie ingeschakeld
OPMERKING: raadpleeg de referentiedocumentatie voor sessie verzenden en ontvangen.
Sessies bieden first-in-first-out en semantiek met één ontvanger boven op een wachtrij of abonnement. Hoewel de werkelijke ontvangstsyntaxis hetzelfde is, verschilt initialisatie enigszins.
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))
OPMERKING: Berichten die van een sessie worden ontvangen, hoeven hun vergrendelingen niet te vernieuwen zoals een ontvanger zonder sessie; in plaats daarvan vindt het vergrendelingsbeheer plaats op sessieniveau met een sessievergrendeling die kan worden vernieuwd met
receiver.session.renew_lock()
Werken met onderwerpen en abonnementen
OPMERKING: raadpleeg de referentiedocumentatie voor onderwerpen en abonnementen.
Onderwerpen en abonnementen bieden een alternatief voor wachtrijen voor het verzenden en ontvangen van berichten. Zie documenten hier voor meer overkoepelende details en over hoe deze verschillen van wachtrijen.
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))
Een bericht vereffenen na ontvangst
Wanneer u berichten uit een wachtrij ontvangt, kunt u meerdere acties uitvoeren op de berichten die u ontvangt.
OPMERKING: U kunt alleen objecten vereffenen
ServiceBusReceivedMessage
die inServiceBusReceiveMode.PEEK_LOCK
de modus worden ontvangen (dit is de standaardinstelling).ServiceBusReceiveMode.RECEIVE_AND_DELETE
de modus verwijdert het bericht uit de wachtrij bij ontvangst.ServiceBusReceivedMessage
berichten die worden geretourneerd vanpeek_messages()
kunnen niet worden vereffend, omdat de berichtvergrendeling niet wordt gebruikt zoals bij de bovengenoemde ontvangstmethoden.
Als het bericht een vergrendeling heeft zoals hierboven vermeld, mislukt de afwikkeling als de berichtvergrendeling is verlopen.
Als de verwerking langer duurt dan de vergrendelingsduur, moet deze worden onderhouden via receiver.renew_message_lock
voordat deze verloopt.
De vergrendelingsduur wordt in Azure ingesteld voor de wachtrij of het onderwerp zelf.
Zie AutoVergrendelingRenewer voor hulp om dit automatisch op de achtergrond uit te voeren.
Voltooid
Hiermee declareert u dat de berichtverwerking is voltooid en wordt het bericht uit de wachtrij verwijderd.
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)
Afbreken
Verwerk de verwerking van het bericht voorlopig en retourneert het bericht onmiddellijk terug naar de wachtrij om te worden opgehaald door een andere (of dezelfde) ontvanger.
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
Breng het bericht over van de primaire wachtrij naar een speciale 'subwachtrij met onbestelbare berichten', waar het kan worden geopend met behulp van de ServiceBusClient.get_<queue|subscription>_receiver
functie met parameter sub_queue=ServiceBusSubQueue.DEAD_LETTER
en kan worden gebruikt vanaf net als elke andere ontvanger. (zie het voorbeeld hier)
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)
Uitstellen
Uitstellen verschilt subtiel van de eerdere vereffeningsmethoden. Hiermee voorkomt u dat het bericht rechtstreeks uit de wachtrij wordt ontvangen door het zo in te stellen dat het moet worden ontvangen via een volgnummer in een oproep naar ServiceBusReceiver.receive_deferred_messages
(zie het voorbeeld hier)
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)
Bericht- of sessievergrendelingen automatisch vernieuwen
OPMERKING: raadpleeg de referentiedocumentatie voor automatische verlenging van vergrendeling.
AutoLockRenewer
is een eenvoudige methode om ervoor te zorgen dat uw bericht of sessie zelfs gedurende lange perioden vergrendeld blijft als bellen receiver.renew_message_lock
/receiver.session.renew_lock
onpraktisch of ongewenst is.
Intern is het niet veel meer dan de afkorting voor het maken van een gelijktijdige watchdog om vergrendelingsvernieuwing uit te voeren als het object bijna is verlopen.
Deze moet als volgt worden gebruikt:
- Berichtenvergrendeling automatisch vernieuwen
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()
- Sessievergrendeling automatisch vernieuwen
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()
Als automatische verlenging om welke reden dan ook is onderbroken of mislukt, kan dit worden waargenomen via de auto_renew_error
eigenschap op het object dat wordt vernieuwd, of door een callback te hebben doorgegeven aan de parameter bij initialisatie van de on_lock_renew_failure
vernieuwingsfunctie.
Het zou zich ook manifesteren wanneer u actie probeert te ondernemen (zoals het voltooien van een bericht) op het opgegeven object.
Problemen oplossen
Logboekregistratie
- Logboekregistratie inschakelen
azure.servicebus
om traceringen uit de bibliotheek te verzamelen. - Schakel
uamqp
logboekregistratie in om traceringen van de onderliggende uAMQP-bibliotheek te verzamelen. - Schakel tracering op AMQP-frameniveau in door in te stellen
logging_enable=True
bij het maken van de client. - Er kunnen gevallen zijn waarin u de
uamqp
logboekregistratie te uitgebreid vindt. Als u onnodige logboekregistratie wilt onderdrukken, voegt u het volgende codefragment toe aan de bovenkant van uw code:
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)
Time-outs
Er zijn verschillende time-outs waar een gebruiker rekening mee moet houden in de bibliotheek.
- 10 minuten service side link sluiting: een koppeling, eenmaal geopend, wordt gesloten na 10 minuten inactief om de service te beschermen tegen het lekken van resources. Dit moet grotendeels transparant zijn voor een gebruiker, maar als u merkt dat er na een dergelijke duur opnieuw verbinding wordt gemaakt, is dit de reden. Als u bewerkingen uitvoert, inclusief beheerbewerkingen, op de koppeling, wordt deze time-out verlengd.
- max_wait_time: Opgegeven bij het maken van een ontvanger of bij het aanroepen
receive_messages()
van , de tijd waarna het ontvangen van berichten stopt nadat er geen verkeer meer is. Dit geldt zowel voor de imperatievereceive_messages()
functie als voor de lengte die een ontvangst in generatorstijl wordt uitgevoerd voordat het wordt afgesloten als er geen berichten zijn. Het doorgeven van Geen (standaard) wacht voor altijd, tot de drempelwaarde van 10 minuten als er geen andere actie wordt ondernomen.
OPMERKING: Als de verwerking van een bericht of sessie voldoende lang is om time-outs te veroorzaken, als alternatief voor het handmatig aanroepen
receiver.renew_message_lock
/receiver.session.renew_lock
, kunt u gebruikmaken van deAutoLockRenewer
functionaliteit die hierboven .
Veelvoorkomende uitzonderingen
De Service Bus-API's genereren de volgende uitzonderingen in azure.servicebus.exceptions:
- ServiceBusConnectionError: Er is een fout opgetreden in de verbinding met de service. Dit kan zijn veroorzaakt door een tijdelijk netwerkprobleem of serviceprobleem. Het wordt aanbevolen om het opnieuw te proberen.
- ServiceBusAuthorizationError: Er is een fout opgetreden bij het autoriseren van de verbinding met de service. Dit kan zijn veroorzaakt doordat de referenties niet de juiste machtiging hebben om de bewerking uit te voeren. Het wordt aanbevolen om de machtiging van de referenties te controleren.
- ServiceBusAuthenticationError: Er is een fout opgetreden bij het verifiëren van de verbinding met de service. Dit kan zijn veroorzaakt doordat de referenties onjuist zijn. Het wordt aanbevolen om de referenties te controleren.
- OperationTimeoutError: Dit geeft aan dat de service niet binnen de verwachte tijd op een bewerking heeft gereageerd. Dit kan zijn veroorzaakt door een tijdelijk netwerkprobleem of serviceprobleem. De service kan de aanvraag al dan niet hebben voltooid; de status niet bekend is. Het wordt aanbevolen om te proberen de huidige status te controleren en het indien nodig opnieuw te proberen.
- MessageSizeExceededError: Dit geeft aan dat de inhoud van het bericht groter is dan de framegrootte van de Service Bus.
Dit kan gebeuren wanneer er te veel Service Bus-berichten in een batch worden verzonden of wanneer de inhoud die in de hoofdtekst van een
Message
wordt doorgegeven, te groot is. Het wordt aanbevolen om het aantal berichten te verminderen dat in een batch wordt verzonden of de grootte van inhoud die wordt doorgegeven aan éénServiceBusMessage
. - MessageAlreadySettled: Dit geeft aan dat het bericht niet kan worden opgelost. Dit kan gebeuren bij het vereffenen van een bericht dat al is opgelost.
- MessageLockLostError: De vergrendeling van het bericht is verlopen en is weer vrijgegeven aan de wachtrij.
Het moet opnieuw worden ontvangen om het te kunnen vereffenen.
U moet op de hoogte zijn van de vergrendelingsduur van een bericht en de vergrendeling vernieuwen voordat deze verloopt in het geval van een lange verwerkingstijd.
AutoLockRenewer
kan helpen bij het automatisch vernieuwen van de vergrendeling van het bericht. - SessionLockLostError: De vergrendeling van de sessie is verlopen.
Alle onopgemaakte berichten die zijn ontvangen, kunnen niet meer worden vereffend.
Het wordt aanbevolen om opnieuw verbinding te maken met de sessie als u indien nodig opnieuw berichten ontvangt.
Houd rekening met de vergrendelingsduur van een sessie en blijf de vergrendeling vernieuwen voordat deze verloopt in het geval van een lange verwerkingstijd.
AutoLockRenewer
kan helpen bij het automatisch vernieuwen van de vergrendeling van de sessie. - MessageNotFoundError: Probeer een bericht te ontvangen met een bepaald volgnummer. Dit bericht is niet gevonden. Zorg ervoor dat het bericht nog niet is ontvangen. Controleer de wachtrij met onbestelbare berichten om te zien of het bericht in een impasse is geplaatst.
- MessagingEntityNotFoundError: De entiteit die aan de bewerking is gekoppeld, bestaat niet of is verwijderd. Zorg ervoor dat de entiteit bestaat.
- MessagingEntityDisabledError: Aanvraag voor een runtime-bewerking op een uitgeschakelde entiteit. Activeer de entiteit.
- ServiceBusQuotaExceededError: De berichtenentiteit heeft de maximaal toegestane grootte bereikt of het maximum aantal verbindingen met een naamruimte is overschreden. Maak ruimte in de entiteit door berichten van de entiteit of de bijbehorende submappen te ontvangen.
- ServiceBusServerBusyError: De service kan de aanvraag op dit moment niet verwerken. Client kan een bepaalde tijd wachten en de bewerking vervolgens opnieuw proberen.
- ServiceBusCommunicationError: Client kan geen verbinding maken met Service Bus. Zorg ervoor dat de opgegeven hostnaam juist is en of de host bereikbaar is. Als uw code wordt uitgevoerd in een omgeving met een firewall/proxy, moet u ervoor zorgen dat het verkeer naar het Service Bus-domein/IP-adres en de poorten niet wordt geblokkeerd.
- SessionCannotBeLockedError: Probeer verbinding te maken met een sessie met een specifieke sessie-id, maar de sessie is momenteel vergrendeld door een andere client. Zorg ervoor dat de sessie is ontgrendeld door andere clients.
- AutoLockRenewFailed: Een poging om een vergrendeling van een bericht of sessie op de achtergrond te vernieuwen, is mislukt.
Dit kan gebeuren wanneer de ontvanger die wordt gebruikt door
AutoLockRenewer
is gesloten of de vergrendeling van de hernieuwbare energie is verlopen. Het wordt aanbevolen om het hernieuwbare bericht of de sessie opnieuw te registreren door het bericht te ontvangen of opnieuw verbinding te maken met de sessievolle entiteit. - AutoLockRenewTimeout: De tijd die is toegewezen om het bericht of de sessievergrendeling te vernieuwen, is verstreken. U kunt het object dat automatisch vergrendelen wilt vernieuwen opnieuw registreren of de time-out van tevoren verlengen.
- ServiceBusError: Alle andere fouten met betrekking tot Service Bus. Het is de hoofdfoutklasse van alle hierboven beschreven fouten.
Bekijk de naslagdocumenten voor uitzonderingen voor gedetailleerde beschrijvingen van onze algemene uitzonderingstypen.
Volgende stappen
Meer voorbeeldcode
In de map met voorbeelden vindt u meer voorbeelden waarin veelvoorkomende Service Bus-scenario's worden gedemonstreerd, zoals verzenden, ontvangen, sessiebeheer en berichtafhandeling.
Aanvullende documentatie
Zie de Service Bus-documentatie op docs.microsoft.com voor uitgebreidere documentatie over de Service Bus-service .
Beheermogelijkheden en documentatie
Voor gebruikers die beheerbewerkingen willen uitvoeren op ServiceBus (een wachtrij/onderwerp/enzovoort maken, filterregels wijzigen, entiteiten opsommen) raadpleegt u de documentatie azure-mgmt-servicebus voor API-documentatie . Voorbeelden van terse-gebruik vindt u hier ook.
Pure Python AMQP-transport- en achterwaartse compatibiliteitsondersteuning
De Azure Service Bus clientbibliotheek is nu gebaseerd op een pure Python AMQP-implementatie. uAMQP
is verwijderd als vereiste afhankelijkheid.
Als u wilt gebruiken uAMQP
als het onderliggende transport:
- Installeren
uamqp
met pip.
$ pip install uamqp
- Pass
uamqp_transport=True
tijdens bouw van de 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
)
Opmerking: het message
kenmerk op ServiceBusMessage
//ServiceBusMessageBatch
ServiceBusReceivedMessage
, waarmee eerder de uamqp.Message
werd weergegeven, is afgeschaft.
De verouderde objecten die door message
het kenmerk worden geretourneerd, zijn geïntroduceerd om de overgang te vergemakkelijken.
UAMQP-wiel bouwen vanuit bron
azure-servicebus
is afhankelijk van de uAMQP voor de implementatie van het AMQP-protocol.
uAMQP-wielen worden geleverd voor de meeste belangrijke besturingssystemen en worden automatisch geïnstalleerd bij de installatie azure-servicebus
van .
Als uAMQP is bedoeld om te worden gebruikt als de onderliggende IMPLEMENTATIE van het AMQP-protocol voor azure-servicebus
, kunt uAMQP-wielen vinden voor de meeste grote besturingssystemen.
Als u werkt op een platform waarvoor geen uAMQP-wielen zijn opgegeven, volgt u Als u van plan bent te gebruiken uAMQP
en u werkt op een platform waarvoor uAMQP-wielen niet zijn opgegeven, volgt u de richtlijnen voor uAMQP-installatie om te installeren vanaf de bron.
Bijdragen
Wij verwelkomen bijdragen en suggesties voor dit project. Voor de meeste bijdragen moet u instemmen met een licentieovereenkomst voor bijdragers (CLA: Contributor License Agreement) waarin u verklaart dat u gerechtigd bent ons het recht te geven uw bijdrage te gebruiken, en dat u dit ook doet. Ga naar https://cla.microsoft.com voor meer informatie.
Wanneer u een pull-aanvraag indient, wordt met een CLA-bot automatisch bepaald of u een CLA moet verschaffen en wordt de pull-aanvraag dienovereenkomstig opgemaakt (bijvoorbeeld met een label of commentaar). Volg gewoon de instructies van de bot. U hoeft dit maar eenmaal te doen voor alle repo's waar gebruik wordt gemaakt van onze CLA.
Op dit project is de Microsoft Open Source Code of Conduct (Microsoft Open Source-gedragscode) van toepassing. Zie de Veelgestelde vragen over de gedragscode voor meer informatie of neem contact op opencode@microsoft.com met eventuele aanvullende vragen of opmerkingen.
Azure SDK for Python