2012-01-25 6 views
4
#!/usr/bin/env python 
import sys 
import json 
import gearman 
from fabric import * 
from fabric.api import * 
from gearman import GearmanWorker 


# 
# Run the ssh task 
# 
def exe_job(worker, job): 
    d = json.loads(job.data) 
    env.host_string = d['host'] 
    cmd = d['command'] 
    retries = int(d['retries']) 
    output = "" 

    # Run the fabric command. Do not abort on exit 
    # Run job for the given number of retries 
    tmp_retries = retries; 
    while retries > 0: 
     with settings(warn_only=True): 
      result = run(cmd) 
      output = output + str(result) 

     if result.failed: 
      if retries == 1: 
       job.send_fail() 
       break 
      else: 
       next 
     else: 
      break 

     retries = retries - 1 

    return output 


# 
# Main function 
# 
def main(): 
    gm_worker = gearman.GearmanWorker(['localhost:4730']) 
    gm_worker.register_task('exe_job',exe_job) 
    gm_worker.work() 


if __name__ == '__main__': 
    main() 

私のコードでは、ユーザーが指定した再試行回数のギアマンジョブ(ファブリックコマンドを実行)を再試行しようとしています。試行ごとに、私はキャプチャして出力を追加しています。最後の再試行で、ジョブが失敗した場合、出力をクライアントに戻したいと思います。gearman workerから失敗したジョブ出力を送信する最善の方法は何ですか?

何が起きているかは、job.send_fail()コマンドが単に中断し、失敗したコマンドの出力を返すために "return output"コマンドにまったく移動しないということです。

ジョブが失敗し、終了時または失敗時にクライアントにデータを返す良い方法はありますか?

答えて

3

Gearmanでは、send_fail()関数はパラメータを取りません。このワーカーでこのジョブが失敗したことをジョブサーバーに通知するだけで、サーバーは再試行などを行うことができます。

この手順を同期して実行する場合は、クライアント側で「再試行または再試行」を行う方がよいでしょう。

あなたのプロシージャを非同期で実行すると、sendExceptionの機能を使用することができます(私のコンピュータのpythonのgearmanモジュールがsend_job_exception()です)。この関数は、クライアント情報。

そして最後に、あなたは、単にこの簡単な方法のようにそれを行うことができます(!しかし、あなたのgearmanクライアントが「GEARMAN_SUCCESS」RETURN CODEを受け取ることになります)

#some codes 
while retries > 0: 
    with settings(warn_only=True): 
     result = run(cmd) 
     output = output + str(result) 

    if result.failed: 
     if retries == 1: 
      #job.send_fail() 
      output = "FAILED_JOB" + "some_return_str" 
      break 
     else: 
      next 
    else: 
     break 

    retries = retries - 1 

return output 

this linkはあまりにも、あなたを助けるでしょう。

関連する問題