這可以用RabbitMQ dead-letter exchange擴展完成。發佈任務時,您將其放在沒有使用者的隊列中,並將使用者隊列聲明爲死信隊列。當消息TTL在原始交換中到期時,它將成爲消費者隊列的死信,然後消耗它。
要與芹菜做到這一點,你將宣佈一個隊列
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
是選擇'X-消息ttl'和'X-expires'強制性的這個例子嗎?根據rabbitmq文檔,當'x-message-ttl'到期或者模擬「基本拒絕」時,就會發生這種情況。我使用上面的conf來拒絕芹菜的信息。該消息出現在「wait」隊列中,但在拒絕後不會出現在「default」隊列中。有什麼我失蹤了嗎? –