import datetime import json import pika from django.db import transaction from django.db.models import Q from django.utils import timezone from Main.models.outbox_message import OutboxMessage from Sprint import settings from SprintLib.utils import LoopWorker class Command(LoopWorker): sleep_period = 0.1 def send_message(self, message): with pika.BlockingConnection( pika.ConnectionParameters( host=settings.RABBIT_HOST, port=settings.RABBIT_PORT, credentials=pika.PlainCredentials("guest", settings.RABBIT_PASSWORD), ) ) as connection: channel = connection.channel() channel.queue_declare(queue=message.queue) channel.basic_publish( exchange="", routing_key=message.queue, body=json.dumps({"id": message.id, "body": message.body}).encode("utf-8"), ) def go(self): messages = OutboxMessage.objects.filter( Q(time_sent__isnull=True) | Q(time_sent__lte=(timezone.now() - datetime.timedelta(minutes=5)), time_processed__isnull=True) ).order_by( "time_created" ) for message in messages: with transaction.atomic(): message.time_sent = timezone.now() message.save() self.send_message(message)