mirror of
https://github.com/django-q2/django-q2.git
synced 2026-09-24 08:18:12 +08:00
* added IronMQ * added Aws SQS * removed SafeRedis. During tests the 'safe' part wasn't consistent enough
52 lines
1.8 KiB
Python
52 lines
1.8 KiB
Python
import random
|
|
import redis
|
|
from django_q.brokers import Broker
|
|
from django_q.conf import Conf
|
|
|
|
|
|
class Disque(Broker):
|
|
|
|
def enqueue(self, task):
|
|
return self.connection.execute_command(
|
|
'ADDJOB {} {} 500 RETRY {}'.format(self.list_key, task, Conf.RETRY)).decode()
|
|
|
|
def dequeue(self):
|
|
task = self.connection.execute_command('GETJOB TIMEOUT 1000 FROM {}'.format(self.list_key))
|
|
if task:
|
|
return task[0][1].decode(), task[0][2].decode()
|
|
|
|
def queue_size(self):
|
|
return self.connection.execute_command('QLEN {}'.format(self.list_key))
|
|
|
|
def acknowledge(self, task_id):
|
|
return self.connection.execute_command('ACKJOB {}'.format(task_id))
|
|
|
|
def ping(self):
|
|
return self.connection.ping()
|
|
|
|
def delete(self, task_id):
|
|
return self.connection.execute_command('DELJOB {}'.format(task_id))
|
|
|
|
def delete_queue(self):
|
|
jobs = self.connection.execute_command('JSCAN QUEUE {}'.format(self.list_key))[1]
|
|
if jobs:
|
|
self.connection.execute_command('DELJOB {}'.format(' '.join(map(str, jobs))))
|
|
|
|
@staticmethod
|
|
def get_connection(list_key=Conf.PREFIX):
|
|
# randomize nodes
|
|
random.shuffle(Conf.DISQUE)
|
|
# find one that works
|
|
for node in Conf.DISQUE:
|
|
host, port = node.split(':')
|
|
redis_client = redis.Redis(host, int(port))
|
|
try:
|
|
if Conf.DISQUE_AUTH:
|
|
redis_client.execute_command('AUTH {}'.format(Conf.DISQUE_AUTH))
|
|
redis_client.decode_responses = True
|
|
redis_client.execute_command('HELLO')
|
|
return redis_client
|
|
except redis.exceptions.ConnectionError:
|
|
continue
|
|
raise ConnectionError('Could not connect to any Disque nodes')
|