2013-10-07 37 views
2

我想添加一條消息給經紀人,而沒有經紀人發佈給訂戶。芹菜添加到經紀沒有發佈

然後我想在稍後的日子告訴經紀人發佈消息。

我想這樣做,所以我可以設置一次性預定義任務,只能通過調用它來執行。

另一種我都試過,這並不工作要做:

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

但這並不吊銷任務 - 執行任務。

回答

3

這可以用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

+0

是選擇'X-消息ttl'和'X-expires'強制性的這個例子嗎?根據rabbitmq文檔,當'x-message-ttl'到期或者模擬「基本拒絕」時,就會發生這種情況。我使用上面的conf來拒絕芹菜的信息。該消息出現在「wait」隊列中,但在拒絕後不會出現在「default」隊列中。有什麼我失蹤了嗎? –

相關問題