def _enqueue_message(redis, logger, msg, message_key, message_hash_key, queue_name): timestamp = to_unix(datetime.utcnow()) pipe = redis.pipeline() pipe.set(message_key, msg.serialize()) pipe.zadd(message_hash_key, {msg.id: timestamp}) pipe.lpush(queue_name, msg.id) if msg.cron_str is not None: next_dt = get_next_cron_timestamp(msg.cron_str) timestamp = to_unix(next_dt) _enqueue_at_timestamp( pipe, logger, msg.queue, Queue.get_message_name, timestamp, msg.category, msg.cron_str, *msg.args, **msg.kwargs, ) return pipe.execute()
def enqueue_message(self, message): timestamp = to_unix(datetime.utcnow()) pipe = self.redis.pipeline() pipe.set(message.message_key(), message.serialize()) pipe.zadd(message.message_hash_key(), {message.id: timestamp}) pipe.lpush(message.queue, message.id) if message.cron_str: next_dt = get_next_cron_timestamp(message.cron_str) timestamp = to_unix(next_dt) msg_schedule = Message(message.queue, message.category, message.cron_str, *message.args, **message.kwargs) self._pipe_at_timestamp(pipe, msg_schedule, timestamp) return pipe.execute()
def test_schedule3(client): """Test Scheduling a job with cron""" queue = client.application.jobs_queue cron_str = "* * * * *" timestamp = to_unix(get_next_cron_timestamp(cron_str)) enqueued_id = queue.enqueue_cron(cron_str, Categories.Monitor, "something", other="öther") redis = client.application.redis expect(redis.llen(queue.queue_name)).to_equal(0) expect(redis.zcard(Queue.SCHEDULED_QUEUE_NAME)).to_equal(1) items = redis.zrange(Queue.SCHEDULED_QUEUE_NAME, 0, -1, withscores=True) expect(items).to_length(1) message_id, actual_ts = items[0] expect(actual_ts).to_equal(timestamp) expect(message_id).to_equal(enqueued_id) message_key = queue.get_message_name(enqueued_id) expect(redis.exists(message_key)).to_be_true() data = redis.get(message_key) job = Message.deserialize(data) job = Message.deserialize(data) expect(job.id).to_equal(enqueued_id) expect(job.category).to_equal(Categories.Monitor) expect(job.args).to_length(1) expect(job.args[0]).to_equal("something") expect(job.kwargs).to_include("other") expect(job.kwargs["other"]).to_equal("öther")
def enqueue_cron(self, cron, category, *args, **kw): next_dt = get_next_cron_timestamp(cron) timestamp = to_unix(next_dt) return self.__enqueue_at_timestamp(timestamp, category, cron, *args, **kw)