46 lines
1.4 KiB
Python
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)
|