Update rabbitmq test

This commit is contained in:
2024-08-05 23:37:04 +02:00
parent bba89794a2
commit 898da84dc3
3 changed files with 302 additions and 58 deletions

View File

@@ -0,0 +1,114 @@
#!/usr/bin/env python
import pika
import argparse
import logging
import time
import random
from datetime import datetime
# Configuración del logger
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
def parse_arguments():
"""
Analiza los argumentos de línea de comandos utilizando argparse.
Devuelve un objeto con los argumentos proporcionados por el usuario.
"""
parser = argparse.ArgumentParser(
description='Enviar mensajes a un intercambio de tipo "topic" en RabbitMQ.')
parser.add_argument(
'routing_key', help='La clave de enrutamiento para el mensaje.')
parser.add_argument(
'message', nargs='*', default=['Hola', 'Mundo!'], help='El mensaje base a enviar.')
return parser.parse_args()
def establish_connection():
"""
Establece una conexión con RabbitMQ.
Retorna el objeto de conexión si es exitoso.
Salida del programa si hay un error de conexión.
"""
try:
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
return connection
except pika.exceptions.AMQPConnectionError as e:
logging.error('\n[!] Error al conectar con RabbitMQ: %s', e)
sys.exit(1)
def declare_exchange(channel):
"""
Declara el intercambio de tipo 'topic'.
Salida del programa si hay un error al declarar el intercambio.
"""
try:
channel.exchange_declare(exchange='topic_logs', exchange_type='topic')
except pika.exceptions.ChannelError as e:
logging.error('\n[!] Error al declarar el intercambio: %s', e)
sys.exit(1)
def generate_message(base_message):
"""
Genera un mensaje único que incluye un número aleatorio, fecha y hora actual.
"""
random_id = random.randint(
1000, 9999) # Genera un ID aleatorio de 4 dígitos
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') # Fecha y hora actual
return f"{timestamp} - ({random_id}): {base_message}"
def publish_message(channel, routing_key, message):
"""
Publica un mensaje en el intercambio declarado.
"""
channel.basic_publish(exchange='topic_logs',
routing_key=routing_key, body=message)
logging.info(' [+] Enviado %s:%s', routing_key, message)
def main():
"""
Función principal que orquesta la ejecución del script.
"""
# Parsear los argumentos de línea de comandos
args = parse_arguments()
routing_key = args.routing_key
base_message = ' '.join(args.message)
# Establecer conexión y publicar mensaje cada 5 segundos
with establish_connection() as connection:
channel = connection.channel()
declare_exchange(channel)
try:
while True:
# Generar y publicar el mensaje
message = generate_message(base_message)
publish_message(channel, routing_key, message)
# Espera de 5 segundos antes de enviar el siguiente mensaje
time.sleep(5)
except KeyboardInterrupt:
logging.info("\n[!] Interrupción del usuario. Terminando...")
except Exception as e:
logging.error("\n[!] Se produjo un error inesperado: %s", e)
if __name__ == '__main__':
main()

View File

@@ -0,0 +1,122 @@
#!/usr/bin/env python
import pika
import argparse
import logging
import sys
# Configuración del logger
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
def parse_arguments():
"""
Analiza los argumentos de línea de comandos utilizando argparse.
Devuelve un objeto con los argumentos proporcionados por el usuario.
"""
parser = argparse.ArgumentParser(
description='Recibe mensajes de un intercambio de tipo "topic" en RabbitMQ.')
parser.add_argument('binding_keys', nargs='+',
help='Lista de claves de enlace para filtrar los mensajes.')
return parser.parse_args()
def establish_connection():
"""
Establece una conexión con RabbitMQ.
Retorna el objeto de conexión si es exitoso.
Salida del programa si hay un error de conexión.
"""
try:
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
return connection
except pika.exceptions.AMQPConnectionError as e:
logging.error('[!] Error al conectar con RabbitMQ: %s', e)
sys.exit(1)
def declare_exchange_and_queue(channel):
"""
Declara el intercambio de tipo 'topic' y una cola exclusiva.
Retorna el nombre de la cola creada.
"""
try:
channel.exchange_declare(exchange='topic_logs', exchange_type='topic')
result = channel.queue_declare('', exclusive=True)
return result.method.queue
except pika.exceptions.ChannelError as e:
logging.error('[!] Error al declarar el intercambio o la cola: %s', e)
sys.exit(1)
def bind_queue(channel, queue_name, binding_keys):
"""
Vincula la cola al intercambio con las claves de enlace proporcionadas.
"""
for binding_key in binding_keys:
try:
channel.queue_bind(exchange='topic_logs',
queue=queue_name, routing_key=binding_key)
logging.info(
' [i] Cola vinculada con clave de enlace: %s', binding_key)
except pika.exceptions.ChannelError as e:
logging.error(
'[!] Error al vincular la cola con la clave de enlace %s: %s', binding_key, e)
sys.exit(1)
def callback(ch, method, properties, body):
"""
Función de callback que maneja los mensajes recibidos.
"""
logging.info(' [+] %s: %s', method.routing_key.upper(), body.decode())
def start_consuming(channel, queue_name):
"""
Inicia la recepción de mensajes desde la cola especificada.
"""
channel.basic_consume(
queue=queue_name, on_message_callback=callback, auto_ack=True)
logging.info(' [i] Esperando mensajes. Para salir presione CTRL+C')
try:
channel.start_consuming()
except KeyboardInterrupt:
logging.info(' [!] Interrupción del usuario. Terminando...')
channel.stop_consuming()
def main():
"""
Función principal que orquesta la ejecución del script.
"""
# Parsear los argumentos de línea de comandos
args = parse_arguments()
binding_keys = args.binding_keys
# Establecer conexión, declarar intercambio y cola, vincular y comenzar a consumir
with establish_connection() as connection:
channel = connection.channel()
queue_name = declare_exchange_and_queue(channel)
bind_queue(channel, queue_name, binding_keys)
start_consuming(channel, queue_name)
if __name__ == '__main__':
main()