我想向代理添加一条消息,而无需代理将其发布给订阅者。
然后,我想在以后告诉代理发布消息。
我想这样做,所以我可以设置一个一次性的预定义任务,只能通过调用它来执行。
我尝试过的另一种不起作用的方法是:
task = tasks.send_message.apply_async(['hello'], countdown=60)
revoke(task.task_id, terminate=True)`
但这不会撤销任务 - 任务执行。
我想向代理添加一条消息,而无需代理将其发布给订阅者。
然后,我想在以后告诉代理发布消息。
我想这样做,所以我可以设置一个一次性的预定义任务,只能通过调用它来执行。
我尝试过的另一种不起作用的方法是:
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