Telezab/app/extensions/rabbitmq.py
UdoChudo 295c1f68e0
All checks were successful
Build and Push Docker Images / build (push) Successful in 1m11s
chore: (rabbitmq flask client) optimize imports to resolve warnings
Signed-off-by: UdoChudo <stream@udochudo.ru>
2025-06-23 00:38:25 +05:00

67 lines
2.1 KiB
Python

import time
import pika
from pika.exceptions import ChannelClosedByBroker, ConnectionClosed, AMQPConnectionError
from config import RABBITMQ_HOST, RABBITMQ_PORT, RABBITMQ_LOGIN, RABBITMQ_PASS, RABBITMQ_QUEUE
class RabbitMQClient:
def __init__(self):
self._connect()
def _connect(self):
credentials = pika.PlainCredentials(RABBITMQ_LOGIN, RABBITMQ_PASS)
parameters = pika.ConnectionParameters(
host=RABBITMQ_HOST,
port=RABBITMQ_PORT,
credentials=credentials,
heartbeat=600,
blocked_connection_timeout=300
)
self.connection = pika.BlockingConnection(parameters)
self.channel = self.connection.channel()
self.channel.queue_declare(queue=RABBITMQ_QUEUE, durable=True)
def publish_message(self, message: str, retry=1):
try:
if not self.connection or self.connection.is_closed or not self.channel or self.channel.is_closed:
self._connect()
self.channel.basic_publish(
exchange='',
routing_key=RABBITMQ_QUEUE,
body=message,
properties=pika.BasicProperties(
delivery_mode=2,
)
)
except (ChannelClosedByBroker,
ConnectionClosed,
AMQPConnectionError) as e:
if retry > 0:
# Короткая пауза перед переподключением
time.sleep(1)
self._connect()
self.publish_message(message, retry=retry-1)
else:
raise e
def close(self):
if self.connection and self.connection.is_open:
self.connection.close()
def close(self):
if self.connection and self.connection.is_open:
self.connection.close()
# Глобальная переменная
rabbitmq_client = None
def get_rabbitmq_client():
global rabbitmq_client
if rabbitmq_client is None:
rabbitmq_client = RabbitMQClient()
return rabbitmq_client