Verwenden Sie verschiedene Rabbimq-Funktionen mit Python Pika

Einführung

Im vorherigen Umgang mit Rabbimq mit Python habe ich einfache Nachrichten mit RabbitMq ausgetauscht, aber da RabbitMq verschiedene Funktionen hat, sind diesmal verschiedene. Funktionen und Verwendung sind zusammengefasst.

Umgebung

Einstellungen für die Warteschlangenbestätigung

Wenn mit den Standard-Pika-Einstellungen die Warteschlange, die Sie senden und empfangen möchten, in Rabbit Mq nicht vorhanden ist, wird sie automatisch erstellt. Möglicherweise möchten Sie jedoch einen Fehler machen, ohne die Warteschlange automatisch zu erstellen. In diesem Fall führt die Angabe von True für das passive Argument der Funktion `queue_declare ()` des Kanals zu einem Fehler, wenn keine Warteschlange vorhanden ist.

Situationsbeispiel

Zum Beispiel, wenn Sie alle Warteschlangen auf der Herstellerseite verwalten und reine Verbindungen auf der Verbraucherseite zulassen möchten.

Produzent mit passiv auf true gesetzt

Ich habe gerade `passive = True zu dem Produzenten channel.queue_declare () hinzugefügt, der wie im vorherigen Beispiel erstellt wurde. Wenn die Warteschlange vorhanden ist, können Sie eine Verbindung herstellen, aber wenn die Warteschlange nicht vorhanden ist, wird als Ausnahme `` pika.exceptions.ChannelClosedByBroker`` `angezeigt.

client_main.py



import pika

pika_param = pika.ConnectionParameters('localhost')
connection = pika.BlockingConnection(pika_param)
channel = connection.channel()

try:
    channel.queue_declare(queue='hello', passive=True)
except pika.exceptions.ChannelClosedByBroker as ex:
    print(ex)
    exit(1)

channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')

connection.close()

Führen Sie eine Warteschlangenprüfung durch

Nachdem wir die Quelle haben, lassen Sie es uns ausführen. Eine Ausnahme ist aufgetreten. Wenn Sie sich die aufgetretene Ausnahme ansehen, sehen Sie, dass es keine Hallo-Warteschlange gibt.


PS C:\Users\xxxx\program\python\pika> python .\client_main.py
(404, "NOT_FOUND - no queue 'hello' in vhost '/'")

Exklusive Verbindungseinstellungen

Die Standard-Pika-Einstellung akzeptiert Verbindungen bedingungslos. Sie können jedoch die exklusive Steuerung anwenden, damit andere Verbindungen nicht akzeptiert werden. Wenn in diesem Fall True für das exklusive Argument der Funktion `queue_declare ()` des Kanals angegeben wird, tritt ein Fehler auf, wenn eine andere Verbindung verbunden ist, sodass der Ausschluss überprüft werden kann. Wenn Sie die Verbindung schließen, können Sie eine andere Verbindung herstellen.

Situationsbeispiel

Zum Beispiel, wenn Sie keine Nachrichten von anderen Verbrauchern annehmen möchten, bis Sie die Nachricht auf der Verbraucherseite vorbereitet und an RabbitMq gesendet haben.

Produzent mit aktivierten exklusiven Verbindungseinstellungen

channel.queue_declare()Exklusiv bei=Ich füge nur True hinzu. Dieses Mal stelle ich nach einmaliger Verbindung eine neue Verbindung her und verbinde mich, ohne die Verbindung zu schließen. Für Verbindungen, die später kommen, pika.exceptions.ChannelClosedByBroker tritt als Ausnahme auf.





#### **` client_main.py`**
```py


import pika

pika_param = pika.ConnectionParameters('localhost')
connection = pika.BlockingConnection(pika_param)
channel = connection.channel()
channel.queue_declare(queue='hello', exclusive=True)
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
channel.close()

connection = pika.BlockingConnection(pika_param)
channel = connection.channel()
try:
    channel.queue_declare(queue='hello')
except pika.exceptions.ChannelClosedByBroker as ex:
    print('other connection access fail')
    exit(1)
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
channel.close()

channel.close()Unter Verbindung.close()Wenn Sie eingeben, endet es normal.



## Ausführung der exklusiven Verbindung
 Nachdem wir die Quelle haben, lassen Sie es uns ausführen. Während der zweiten Warteschlangenverbindung ist eine Ausnahme aufgetreten. Wenn Sie die aufgetretene Ausnahme anzeigen, können Sie sehen, dass Hallo eine Zugriffssperre hat.

PS C:\Users\xxxx\program\python\pika> python .\client_main.py other connection access fail (405, "RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'hello' in vhost '/'. It could be originally declared on another connection or the exclusive property value does not match that of the original declaration.")



# Einstellung des Kanallimits
 Mit den Standard-Pika-Einstellungen können Sie bedingungslos Kanäle erstellen, aber Sie können die Obergrenze des Kanals festlegen. In diesem Fall können Sie die Obergrenze festlegen, indem Sie dem Argument channel_max der Funktion `` `pika.ConnectionParameters ()` `` von pika eine Obergrenze zuweisen. Ein Fehler tritt auf, wenn Sie versuchen, einen Kanal zu erstellen, der das Limit überschreitet.

## Situationsbeispiel
 Da der Server von RabbitMq nicht reichlich vorhanden ist, wird beim Anpassen der Anzahl der generierten Kanäle usw.

## Produzent mit aktivierten Channel Caps

#### **` pika.ConnectionParameters()Kanal_max=Ich füge nur 2 hinzu. Dieses Mal ist die Obergrenze auf 2 eingestellt, sodass 3 Kanäle bedeutungslos erstellt werden. Infolgedessen konnte Pika nicht für den dritten Kanal erstellt werden.exceptions.ConnectionClosedByBroker tritt als Ausnahme auf.`**

client_main.py



import pika

pika_param = pika.ConnectionParameters('localhost', channel_max=2)
connection = pika.BlockingConnection(pika_param)

channel = connection.channel(1)
channel = connection.channel(2)
try:
    channel = connection.channel(3)
except pika.exceptions.ConnectionClosedByBroker as ex:
    print('channel crate error')
    print(ex)

Ausführung der Kanalkappe

Nachdem wir die Quelle haben, lassen Sie es uns ausführen. Beim Erstellen des dritten Kanals ist eine Ausnahme aufgetreten. Wenn Sie die aufgetretene Ausnahme anzeigen, sehen Sie, dass das Kanallimit 2 beträgt.


PS C:\Users\xxxx\program\python\pika> python .\client_main.py
channel crate error
(530, 'NOT_ALLOWED - number of channels opened (2) has reached the negotiated channel_max (2)')

Einstellungen wiederholen

Sie können die Anzahl der Wiederholungsversuche festlegen, wenn die Pika-Verbindung fehlschlägt. In diesem Fall können Sie die Anzahl festlegen, indem Sie die Anzahl der Wiederholungen für das Argument connection_attempts der Funktion `pika.ConnectionParameters ()` von pika angeben.

Situationsbeispiel

Wenn das Netzwerk zum Server von Rabbit Mq instabil ist usw.

Produzent mit aktivierten Wiederholungseinstellungen

pika.ConnectionParameters()Verbunden mit_attempts=Ich füge nur 2 hinzu. Dieses Mal wird RabbitMq gelöscht, indem ein Pika-Protokoll erstellt wird, damit Sie sehen können, dass es erneut versucht wird. Top Logger.Das xxx-System ist eine Einstellung für die Ausgabe des Protokolls in pika.





#### **` client_main.py`**
```py


import pika
import datetime
import logging 

logger = logging.getLogger('pika')
logger.setLevel(logging.ERROR)
logger.addHandler(logging.StreamHandler())
pika_param = pika.ConnectionParameters('localhost', connection_attempts=2)

try:
    print('start connect {}'.format(datetime.datetime.now()))
    connection = pika.BlockingConnection(pika_param)
except pika.exceptions.AMQPConnectionError as ex:
    print('connect error {}'.format(datetime.datetime.now()))
    print(ex)

Wiederholungsversuch ausführen

Nachdem wir die Quelle haben, lassen Sie es uns ausführen. Es ist schwer zu verstehen, da es viele Protokolle gibt, aber ähnliche Fehler sind viermal aufgetreten (zweimal Fehler x Wiederholungsversuch (2 Mal)).


PS C:\Users\xxxx\program\python\pika> python .\client_main.py
start connect 2020-03-01 21:46:18.549268
Socket failed to connect: <socket.socket fd=936, family=AddressFamily.AF_INET6, type=SocketKind.SOCK_STREAM, proto=6, laddr=('::', 38520, 0, 0)>; error=10061 (Unknown error)
TCP Connection attempt failed: ConnectionRefusedError(10061, 'Unknown error'); dest=(<AddressFamily.AF_INET6: 23>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('::1', 5672, 0, 0))
AMQPConnector - reporting failure: AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error')
Socket failed to connect: <socket.socket fd=936, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6, laddr=('0.0.0.0', 38524)>; error=10061 (Unknown error)
TCP Connection attempt failed: ConnectionRefusedError(10061, 'Unknown error'); dest=(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('127.0.0.1', 5672))
AMQPConnector - reporting failure: AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error')
Socket failed to connect: <socket.socket fd=812, family=AddressFamily.AF_INET6, type=SocketKind.SOCK_STREAM, proto=6, laddr=('::', 38533, 0, 0)>; error=10061 (Unknown error)
TCP Connection attempt failed: ConnectionRefusedError(10061, 'Unknown error'); dest=(<AddressFamily.AF_INET6: 23>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('::1', 5672, 0, 0))
AMQPConnector - reporting failure: AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error')
Socket failed to connect: <socket.socket fd=812, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6, laddr=('0.0.0.0', 38535)>; error=10061 (Unknown error)
TCP Connection attempt failed: ConnectionRefusedError(10061, 'Unknown error'); dest=(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('127.0.0.1', 5672))
AMQPConnector - reporting failure: AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error')
AMQP connection workflow failed: AMQPConnectionWorkflowFailed: 4 exceptions in all; last exception - AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error'); first exception - AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error').
AMQPConnectionWorkflow - reporting failure: AMQPConnectionWorkflowFailed: 4 exceptions in all; last exception - AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error'); first exception - AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 'Unknown error')
Connection workflow failed: AMQPConnectionWorkflowFailed: 4 exceptions in all; last exception - AMQPConnectorSocketConnectError: 
ConnectionRefusedError(10061, 'Unknown error'); first exception - AMQPConnectorSocketConnectError: ConnectionRefusedError(10061, 
'Unknown error')
Error in _create_connection().
Traceback (most recent call last):
  File "C:\Users\minkl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pika\adapters\blocking_connection.py", line 450, in _create_connection
    raise self._reap_last_connection_workflow_error(error)
pika.exceptions.AMQPConnectionError
connect error 2020-03-01 21:46:28.665843

abschließend

Ich habe versucht, die Funktionen von Rabbit Mq zu verwenden, die anscheinend häufig verwendet werden. Ich denke, es hat alle Funktionen, die ich brauche, aber ich war verwirrt, wenn ich nicht verstand und verwendete, welche Einstellungen Warteschlangen, Verbindungen oder Kanäle waren.

Recommended Posts

Verwenden Sie verschiedene Rabbimq-Funktionen mit Python Pika
Verwenden Sie rospy mit virtualenv in Python3
Verwenden Sie Python in pyenv mit NeoVim
Verwenden Sie OpenCV mit Python 3 in Window
Verwenden Sie config.ini mit Python
[Python] Verwenden Sie JSON mit Python
Verwenden Sie Datumsangaben in Python
Verwenden Sie Valgrind mit Python
Verwenden Sie Mecab mit Python 3
Verwenden Sie DynamoDB mit Python
Verwenden Sie Python 3.8 mit Anaconda
Behandle Rabbimq mit Python
Verwenden Sie Python mit Docker
Wie man tkinter mit Python in Pyenv benutzt
Verwenden Sie Python in einer Anaconda-Umgebung mit VS-Code
Verwenden Sie den Profiler in Python
Verwenden Sie die Trello-API mit Python
Verwenden Sie den let-Ausdruck in Python
Schaben mit Selen in Python
Verwenden Sie das Messprotokoll mit Python
Betreiben Sie LibreOffice mit Python
Schaben mit Chromedriver in Python
Verwenden Sie die Rückruffunktion in Python
Verwenden Sie die Twitter-API mit Python
Verwenden Sie den Parameterspeicher in Python
Debuggen mit pdb in Python
Verwenden Sie den HTTP-Cache in Python
Verwenden Sie TUN / TAP mit Python
Umgang mit Sounds in Python
Verwenden Sie in Python ein Diktat mit Listenschlüssel
Scraping mit Selen in Python
Verwenden Sie Random Forest mit Python
Scraping mit Tor in Python
Verwenden Sie Spyder von Python IDE
Tweet mit Bild in Python
Bearbeiten Sie verschiedene Datenbanken mit Python
Kombiniert mit Ordnungszahl in Python
Verwenden Sie die Unterschall-API mit Python3
Zahlenerkennung in Bildern mit Python
Verwenden Sie eine Point Grey-Kamera mit Python (PyCapture2).
Testen mit Zufallszahlen in Python
Verwenden Sie vl53l0x mit RaspberryPi (Python)
GOTO in Python mit erhabenem Text 3
Arbeiten mit LibreOffice in Python: Importieren
Verwenden Sie Stoff wie in Python (Stoff3)
CSS-Analyse mit cssutils in Python
Verwendung von SQLite in Python
Numer0n mit Elementen, die mit Python erstellt wurden
Verwenden Sie NAIF SPICE TOOL KIT mit Python
Öffnen Sie UTF-8 mit Stückliste in Python
Wie man MySQL mit Python benutzt
Verwendung von ChemSpider in Python
Verwenden Sie die Windows 10-Sprachsynthese mit Python
Heatmap mit Dendrogramm in Python + Matplotlib
Verwendung von PubChem mit Python
Lesen Sie Dateien parallel zu Python
Passwort für Lehrbuch mit Python generieren