2014-11-24 68 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崩溃后幸存下来。所以我通过这种方式解决了我的问题。