Dans le précédent Manipulation de rabbimq avec python, j'ai échangé des messages simples avec RabbitMq, mais comme RabbitMq a diverses fonctions, cette fois c'est différent. Les fonctionnalités et l'utilisation sont résumées.
Avec les paramètres pika standard, si la file d'attente que vous souhaitez envoyer et recevoir n'existe pas dans Rabbit Mq, elle sera créée automatiquement, mais vous souhaiterez peut-être faire une erreur sans créer la file d'attente automatiquement. Dans ce cas, donner True à l'argument passif de la fonction `` queue_declare () '' du canal entraînera une erreur s'il n'y a pas de file d'attente.
Par exemple, lorsque vous souhaitez gérer toutes les files d'attente du côté producteur et autoriser les connexions pures du côté consommateur.
Je viens d'ajouter passive = True`
au producteur
channel.queue_declare () '' créé comme l'exemple précédent. Si la file d'attente existe, vous pouvez vous connecter telle quelle, mais si la file d'attente n'existe pas,
pika.exceptions.ChannelClosedByBroker` `` apparaîtra comme une exception.
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()
Maintenant que nous avons la source, exécutons-la. Une exception s'est produite. Si vous regardez l'exception qui s'est produite, vous pouvez voir qu'il n'y a pas de file d'attente Hello.
PS C:\Users\xxxx\program\python\pika> python .\client_main.py
(404, "NOT_FOUND - no queue 'hello' in vhost '/'")
Le paramètre pika standard accepte les connexions sans condition, mais vous pouvez appliquer un contrôle exclusif afin que les autres connexions ne soient pas acceptées. Dans ce cas, si True est donné à l'argument exclusif de la fonction
queue_declare () '' '' du canal, une erreur se produira lorsqu'une autre connexion est connectée, elle peut donc être utilisée pour vérifier l'exclusion. Si vous fermez la connexion, vous pouvez connecter une autre connexion.
Par exemple, lorsque vous ne souhaitez pas accepter les messages d'autres consommateurs tant que vous n'avez pas préparé le message côté consommateur et l'avez envoyé à RabbitMq.
channel.queue_declare()Exclusif à=J'ajoute juste True. Cette fois, après m'être connecté une fois, je fais une nouvelle connexion et je me connecte sans fermer la connexion. Pour les connexions qui viennent plus tard, pika.exceptions.ChannelClosedByBroker est une exception.
#### **` 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()Sous connexion.close()Si vous entrez, cela se terminera normalement.
## Exécution d'une connexion exclusive
Maintenant que nous avons la source, exécutons-la. Une exception s'est produite lors de la deuxième connexion de la file d'attente. Si vous affichez l'exception qui s'est produite, vous pouvez voir que hello a un verrou d'accès.
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.")
# Réglage de la limite de canal
Les paramètres pika standard vous permettent de créer des canaux sans condition, mais vous pouvez définir la limite supérieure du canal. Dans ce cas, vous pouvez définir la limite supérieure en donnant une limite supérieure à l'argument channel_max de la fonction `` `` pika.ConnectionParameters () '' de pika. Une erreur se produit si vous essayez de créer un canal qui dépasse la limite.
## Exemple de situation
Étant donné que le serveur de RabbitMq n'est pas abondant, lors du réglage du nombre de canaux générés, etc.
## Producteur avec limites de canal activées
#### **` pika.ConnectionParameters()Canal_max=J'ajoute juste 2. Cette fois, la limite supérieure est fixée à 2, donc 3 canaux sont créés sans signification. En conséquence, pika n'a pas pu être créé pour la troisième chaîne.exceptions.ConnectionClosedByBroker apparaît comme une exception.`**
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)
Maintenant que nous avons la source, exécutons-la. Une exception s'est produite lors de la création du troisième canal. Si vous affichez l'exception qui s'est produite, vous pouvez voir que la limite de canal est de 2.
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)')
Vous pouvez définir le nombre de tentatives en cas d'échec de la connexion pika. Dans ce cas, vous pouvez définir le nombre en donnant le nombre de tentatives à l'argument connection_attempts de la fonction
pika.ConnectionParameters () '' de pika.
Lorsque le réseau vers le serveur de Rabbit Mq est instable, etc.
pika.ConnectionParameters()Se connecter à_attempts=J'ajoute juste 2. Cette fois, RabbitMq est abandonné en produisant un journal de pika afin que vous puissiez voir qu'il réessaye. Top logger.Le système xxx est un paramètre pour la sortie du journal dans 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)
Maintenant que nous avons la source, exécutons-la. C'est difficile à comprendre car il y a beaucoup de journaux, mais des erreurs similaires se sont produites 4 fois (2 fois l'erreur x la valeur de consigne réessayer (2 fois)).
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
J'ai essayé d'utiliser les fonctions de Rabbit Mq qui semblent être souvent utilisées. Je pense qu'il a toutes les fonctionnalités dont j'ai besoin, mais je me sentais confus si je ne comprenais pas et n'utilisais pas quels paramètres étaient des files d'attente, des connexions ou des canaux.
Recommended Posts