0

私の apps/controllers/model_controller.rb には次のものがあります (モデルの名前/メソッドは、罪のない人を保護するために変更されています):

def background_sync
 @background_task_uid = Model.async_process_model_cache({:name => 'name'})
 @model_sync = ModelSync.new  # Adds a new record in the queue of pending jobs
 @model_sync.process_id = @background_task_uid  # Puts the background process id into the new ModelSync record
 @model_sync.save
end

app/workers/model_worker.rb 内:

def process_model_cache(options={})
     [long background task]
     result = Workling::Return::Store.set(options[:uid], 'done')
     result = Workling::Return::Store.get(options[:uid])  #=>  'done'      
end

このワーカー内で set と get が適切に機能していることに注意してください。問題はその後・・・

app/views/model/index.html.rb に戻ると、バックグラウンド ジョブが完了したかどうかを判断するために、同じコントローラーへのリクエストをポーリングするプロトタイプ ヘルパーがあります。

<%= periodically_call_remote( :url => { :action => :background_complete }, :frequency => 5, :update => 'status_div') %>

また、apps/controllers/model_controller.rb には、バックグラウンド ジョブのステータスを確認するための関数:

def background_complete
 @background_task_uid = ModelSync.find(:last)
 if @background_task_uid
  @background_task_uid.each do |task|
    unless task.process_id == "" || task.process_id.nil?
      @result = Workling::Return::Store.get(task.process_id) #=> nil
      if @result.nil?
        task.destroy
      end
    else
      task.destroy
    end
    unless @result.nil?
      render :text => "<span style='font-size:12px;margin-left:20px;'>"+@result+"</span>"
    else
      @result = "none" if @result.nil?
      render :text => "<span style='font-size:12px;margin-left:20px;'>"+@result+"</span>"
    end
   end
  end
end

最後に、config/environments/development.rb で:

Workling::Return::Store.instance = Workling::Return::Store::MemoryReturnStore.new
Workling::Remote.dispatcher = Workling::Remote::Runners::StarlingRunner.new

(最後の行をコメントして、またはコメントせずにこれを実行しようとしたことに注意してください。コメントアウトすると、Workling は Starling ではなく Spawn に戻ります。)

したがって、問題は、background_complete の次の行から nil を取得することです。

@result = Workling::Return::Store.get(task.process_id) #=> nil
4

2 に答える 2

1

あなたがこの質問をしてから 1 年経っていることは知っていますが、私自身、Starling を始めたばかりなので、今まで見たことがありませんでした。

しかし、あなたの問題は(development.rbから)だったようです:

Workling::Return::Store.instance = Workling::Return::Store::MemoryReturnStore.new
Workling::Remote.dispatcher = Workling::Remote::Runners::StarlingRunner.new

次のようにする必要がありました。

Workling::Return::Store.instance = Workling::Return::Store::StarlingReturnStore.new
Workling::Remote.dispatcher = Workling::Remote::Runners::StarlingRunner.new

少なくともそこにいるGoogle検索者の利益のために... :)

于 2010-08-24T14:08:01.027 に答える
0

この質問に対する答えが見つかりました。修正は、config / environment/development.rbからWorkling::Return::Store.instance行を削除することです。

次に、getANDset呼び出しを次のように置き換えます。

app / workers / model_worker.rb内:

store = Workling::Return::Store::StarlingReturnStore.new
key, value = @uid, @progress
store.set(key, value)

app / controllers / models_controller.rb内:

store = Workling::Return::Store::StarlingReturnStore.new
@result = store.get(task.process_id) 

明らかに、environments.rbでショートカットを宣言して、毎回新しいStarlingReturnStoreを呼び出さないようにする方法がありますが、それを機能させることができないため、私は深遠です。

とにかく、この修正は私のために働きます。各バックグラウンドジョブからの出力を取得して、コントローラーのgetに設定することでレポートします。これは、AJAX呼び出しによってキャプチャされ、RJSを介してページにレポートされます。

良い!

于 2009-08-26T00:10:31.267 に答える