我想在没有经纪人将其发布给订阅者的情况下向经纪人添加消息。
然后,我希望稍后告诉经纪人发布消息。
我想这样做,所以我可以设置一个只能通过调用它来执行的一次性预定义任务。
我尝试过的另一种方法是:
task = tasks.send_message.apply_async(['hello'], countdown=60)
revoke(task.task_id, terminate=True)`
但这并没有撤销任务 - 任务执行。
答案 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
的示例