sprint/daemons/management/commands/outbox.py
2022-10-14 02:35:27 +00:00

46 lines
1.4 KiB
Python

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)