2011-12-19 16 views
6

私は2つのサーバーを持っています:1つはdjangoアプリケーションを実行し、もう1つはrabbitmqキューとCeleryワーカーの両方を実行します。次のようにキュー/労働者を実行しているサーバー上の私のtasks.pyは、タスクが含まれていますそのタスクをインポートできないときにCeleryタスクを実行する

@task(queue="reports") 
def test_task(): 
    time.sleep(120) 

私の目標は、Djangoのビューからこのタスクを実行することです。タスクのコードはdjangoビューとは別のサーバー上にあるので、タスクを呼びたいと思っています。次のコードを使用してdjangoから作業者マシンにタスクを送信しようとしています。

send_task("tasks.test_task", task_id=task_id, args=[], kwargs={}, publisher=publisher, queue=queue) 

私はこの方法を見つけましたが、これまでのところテストは機能しませんでした。

セロリのワーカーサーバー上のセロリの作業者ログファイルでtail -Fをテストしてから、ブラウザのsend_taskを含むビューのURLに移動します。私は、テール出力に「受け取った」と表示するタスクを探していますが、そうではありません。

セロリの作業者のログレベルはDEBUGです。ログファイルにはタスクが適切な名前で登録されていることが表示され、djangoアプリケーションのsettings.pyにはrabbitmqサーバの正しいIPと資格が含まれています。さまざまなアプローチを試してみると、send_taskに渡された文字列を有効なタスク(send_task( 'asdf')など)に変更したときにセロリログファイルにエラーメッセージが表示されることがありました。これにより、ログファイルにUnregisteredErrorが発生しました。しかし、これはときどき発生するだけで、設定と呼び出しのさまざまな組み合わせをテストするにあたっては、動作を確実に再現する方法が見つかりませんでした。

はまた、これは(削除実際の値を持つ)Djangoプロジェクトのsettings.pyの関連セクションです:

CELERY_RESULT_BACKEND = 'amqp' 
BROKER_HOST = 'the.correct.IP.address' 
BROKER_USER = 'the_correct_user' 
BROKER_PASSWORD = 'the_correct_pass' 
BROKER_VHOST = 'the_correct_vhost' 
BROKER_PORT = 5672 

私の周りGoogleで検索してきたとsend_taskに多くを発見していません。私が間違っているかもしれないことに関するアイデア?

+0

両方のマシン間でコードをどのように共有したかを知りたいと思います。ここに私がそれに関連して書いた質問があります:http://stackoverflow.com/questions/28592243/celery-tasks-functions-web-server-vs-remote-serverありがとう! – lajarre

答えて

7

解決済みで、私がsend_taskに渡したパブリッシャーキーワードargが無効で、エラーをスローしています。 AJAXが直接ページに移動するのではなくページをリクエストしていたため、エラーは表示されませんでした。この状況に関する他のすべては正しいものでした。また、不要なキーワードargsとargをsend_taskに渡しました。

send_task("tasks.test_task", task_id=task_id, queue=queue) 
2

あなたがしようとしていたことは不可能です。セロリの労働者は、実行するタスクコードにアクセスする必要があります。その周りには方法がありません。

はREVISED:

をしかし、あなたが本当にやりたいことは次のとおりです。名前だけでタスクを参照する必要があり、労働者にではなく、Djangoのビューが利用可能なコードを、持っています。

+0

あなたはセロリの労働者が実行するコードを必要とするのは間違いありませんが、元の投稿の一部を誤解していると思います。明確にするために、作業者はその上にタスクコードを持っています - それは遠隔から起こりたいタスクの呼び出し*です。したがって、djangoビューは、作業を実行するように作業者に指示します。 –

+0

改訂改訂! – dkamins

関連する問題