def tab_from_q_name(name): if name == dq_name(name): return "delayed" elif name == xq_name(name): return "failed" else: return "standard"
def test_redis_messages_can_be_dead_lettered(redis_broker, redis_worker): # Given that I have an actor that always fails @dramatiq.actor(max_retries=0) def do_work(): raise RuntimeError("failed") # If I send it a message do_work.send() # And then join on its queue redis_broker.join(do_work.queue_name) redis_worker.join() # I expect it to end up in the dead letter queue dead_queue_name = "dramatiq:%s" % xq_name(do_work.queue_name) dead_ids = redis_broker.client.zrangebyscore(dead_queue_name, 0, "+inf") assert dead_ids
def test_redis_dead_lettered_messages_are_cleaned_up(redis_broker, redis_worker): # Given that I have an actor that always fails @dramatiq.actor(max_retries=0) def do_work(): raise RuntimeError("failed") # If I send it a message do_work.send() # And then join on its queue redis_broker.join(do_work.queue_name) redis_worker.join() # I expect running the cleanup script to remove it redis_broker.dead_message_ttl = 0 redis_broker._cleanup() dead_queue_name = "dramatiq:%s" % xq_name(do_work.queue_name) dead_ids = redis_broker.client.zrangebyscore(dead_queue_name, 0, "+inf") assert not dead_ids
def test_redis_messages_belonging_to_missing_actors_are_rejected(redis_broker, redis_worker): # Given that I have a broker without actors # If I send it a message message = Message( queue_name="some-queue", actor_name="some-actor", args=(), kwargs={}, options={}, ) redis_broker.declare_queue("some-queue") message = redis_broker.enqueue(message) # Then join on the queue redis_broker.join("some-queue") redis_worker.join() # I expect the message to end up on the dead letter queue dead_queue_name = "dramatiq:%s" % xq_name("some-queue") dead_ids = redis_broker.client.zrangebyscore(dead_queue_name, 0, "+inf") assert message.options["redis_message_id"].encode("utf-8") in dead_ids
def test_redis_dead_lettered_messages_are_cleaned_up(redis_broker, redis_worker): # Given that I have an actor that always fails @dramatiq.actor(max_retries=0) def do_work(): raise RuntimeError("failed") # When I send it a message do_work.send() # And then join on its queue redis_broker.join(do_work.queue_name) redis_worker.join() # And trigger maintenance redis_broker.dead_message_ttl = 0 redis_broker.maintenance_chance = MAINTENANCE_SCALE redis_broker.do_qsize(do_work.queue_name) # Then the message should be removed from the DLQ. dead_queue_name = "dramatiq:%s" % xq_name(do_work.queue_name) dead_ids = redis_broker.client.zrangebyscore(dead_queue_name, 0, "+inf") assert not dead_ids
def test_xq_name_returns_delay_names(given, expected): assert xq_name(given) == expected
def rabbitmq_random_queue(rabbitmq_broker): queue_name = "rabbit-queue-%s" % uuid.uuid4() yield queue_name rabbitmq_broker.channel.queue_delete(queue_name) rabbitmq_broker.channel.queue_delete(dq_name(queue_name)) rabbitmq_broker.channel.queue_delete(xq_name(queue_name))
def queue_for_tab(name, tab): return { "standard": name, "delayed": dq_name(name), "failed": xq_name(name), }[tab]