芹菜添加到经纪人而不发布

时间:2013-10-07 00:36:36

标签: celery

我想在没有经纪人将其发布给订阅者的情况下向经纪人添加消息。

然后,我希望稍后告诉经纪人发布消息。

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

我尝试过的另一种方法是:

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

但这并没有撤销任务 - 任务执行。

1 个答案:

答案 0 :(得分:3)

这可以通过RabbitMQ dead-letter exchange扩展来完成。发布任务时,将其放在没有使用者的队列中,并将使用者队列声明为死信队列。当消息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

的示例