2

我想向代理添加一条消息,而无需代理将其发布给订阅者。

然后,我想在以后告诉代理发布消息。

我想这样做,所以我可以设置一个一次性的预定义任务,只能通过调用它来执行。

我尝试过的另一种不起作用的方法是:

task = tasks.send_message.apply_async(['hello'], countdown=60)
revoke(task.task_id, terminate=True)`

但这不会撤销任务 - 任务执行。

4

1 回答 1

3

这可以通过 RabbitMQ死信交换扩展来完成。当您发布任务时,您将其放在没有消费者的队列中,并将消费者队列声明为死信队列。当原始交换上的消息 TTL 过期时,它将成为消费者队列的死信,然后将被消费。

要使用 Celery 完成此操作,您需要声明一个队列

from kombu import Exchange, Queue

DEAD_LETTER_OPTIONS = {
    'x-message-ttl': 60 * 10 * 1000, # 10 mins
    'x-dead-letter-exchange': 'default',
    'x-expires': (60 * 10 + 1) * 1000,
}


CELERY_QUEUES = (
    Queue('default', Exchange('default'), routing_key='default'),
    Queue('wait',  Exchange('wait', arguments=DEAD_LETTER_OPTIONS ), routing_key='wait'),
)

然后你会调用你的任务并将其放入wait队列中。

tasks.send_message.apply_async(['hello'], queue='wait')

您还可以看到这个基于一般死信倒计时的示例https://gist.github.com/dgouldin/3485236

于 2013-10-08T13:25:12.440 回答