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.
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.
Zum Beispiel, wenn Sie alle Warteschlangen auf der Herstellerseite verwalten und reine Verbindungen auf der Verbraucherseite zulassen möchten.
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()
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 '/'")
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.
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.
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)
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)')
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.
Wenn das Netzwerk zum Server von Rabbit Mq instabil ist usw.
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)
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
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