You've already forked Curso-lenguaje-python
Update rabbitmq test
This commit is contained in:
114
catch-all/05_infra_test/02_rabbitmq/05_topics/emit_log_topic.py
Normal file
114
catch-all/05_infra_test/02_rabbitmq/05_topics/emit_log_topic.py
Normal 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()
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user