2017-01-20 10 views
0

celery_task_idという列を持つDjangoモデルがあります。私はRabbitMQをブローカーとして使用しています。モデルオブジェクトをパラメータとして取るセロリ関数test_celeryがあります。今私はセロリのタスクを作成する次のコード行を持っています。再配布後にセロリのタスクIDが変更される

def create_celery_task(): 
    celery_task_id = test_celery.apply_async((model_obj,), eta='Future Datetime Object') 
    model_obj.celery_task_id = celery_task_id 
    model_obj.save() 
    ---- 
    ---- 

セロリ関数の内部で、タスクIDがDBに格納されているものと同じかどうかを確認しています。

@app.task 
def test_celery(model_obj): 
    if model_obj.celery_task_id == test_celery.request.id: 
     ## Do something 

私の問題は、私はタスクが受信され、ログに成功したが、もし条件の内のコードを実行していないされて見ることができる例が多いです。

再配布後にセロリのタスクIDが変更される可能性はありますか?または、他の理由があるかどうか。

答えて

0

推奨事項の1つは、古いデータが含まれている可能性があるため、データベース/ ORMオブジェクトをCeleryタスクに渡すことではありません。タスクを次のように書き換えてみてください。

@app.task 
def test_celery(model_obj_id): 
    model_obj = YourModel.objects.get(id=model_obj_id) 
    if model_obj: 
     if model_obj.celery_task_id == test_celery.request.id: 
      ## Do something 
+0

しかし、それでも質問には答えません。 rabbitmq同期プロセス中、または再配布中に 'test_celery.request.id'が変更されますか? – Pattu

+0

IDは変わっていないと思います。私の推測では、条件の左側が機能していない、つまりmodel_obj.celery_task_idはオブジェクトをタスクに提供するためです。あなたの推測では、同期プロセス中にtest_celery.request.idが変化しているため、問題が発生しています。 –

関連する問題