芹菜添加到代理而不发布

  • 本文关键字:代理 添加 芹菜 celery
  • 更新时间 :
  • 英文 :


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

然后,我想在以后告诉经纪人发布消息。

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

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

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

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

这可以通过 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 示例

最新更新