2014-11-24 67 views
0

我對PHP使用的是芹菜https://github.com/gjedeer/celery-php。可靠性對於我們的項目很重要。所以我想確保所有計劃的任務都會執行甚至Rabbitmq崩潰。所以我安排了一項任務,然後我停止了Rabbitmq並重新開始。當預定的時間到了,任務不執行。 這是我的任務。acks_late在Rabbitmq崩潰後未恢復計劃的任務

from celery import Celery 
import subprocess 

app = Celery('tasks', backend='amqp', broker='amqp://') 

@app.task(acks_late=True) 
def hipoCheckSubscriptions(args): 
    return subprocess.call(['php54','/path/to/script', '--args='+args]) 

請幫助,我做錯了什麼?有沒有我的情況下的食譜。

+0

檢查Celery創建的隊列是否持久/持久。如果沒有,請查找適當的Celery設置。請參閱Celery-PHP構造函數中的$ persistent_messages。此外,請檢查:https://stackoverflow.com/questions/5046944/why-is-rabbitmq-not-persistent-messages-on-a-durable-queue – GDR 2014-11-24 11:06:46

+0

@gdr是的,你是正確的** celery-php * * ** $ persistent_messages **選項。但我用我的網絡應用程序Yii extenstion叫** celery-yii **。他們在設置中錯過了這個選項,或者我找不到它。所以我重寫** celery-yii **使消息持久。我的解決方案在下面。 – 2014-11-26 04:07:00

+0

有道理。如果您正在積極使用celery-yii,請考慮爲該項目貢獻一些工作 - 他們與celery-php分開,並且看起來他們在功能上有點落後。 – GDR 2014-11-26 15:41:42

回答

1

我使用了一個名爲celery-yii的Yii擴展,用於我的web應用。我沒有在擴展的默認配置中找到任何消息耐用性設置。所以我搜索了所有的擴展類,以找到哪些方法負責將消息發佈到芹菜。我發現這是芹菜:: PostTask方法。在$ params數組中,它將消息發佈設置傳遞給芹菜交易所。所以我增加了一個選項delivery_mode = 2以保證消息的持久性。這個消息在RabbbitMQ崩潰後倖存下來。所以我通過這種方式解決了我的問題。