Рабочий вернувшийся магазин не извлекает значение из набора - PullRequest
0 голосов
/ 25 августа 2009

В моих приложениях / контроллерах / 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

В приложении / работники / 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 / средах / development.rb:

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

(Обратите внимание, что я пытался запустить это с последней строкой и без нее. Если закомментировано, Workling возвращается к Spawn, а не к Starling.)

Так что проблема в том, что я получаю ноль из этой строки в background_complete:

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

Ответы [ 2 ]

1 голос
/ 24 августа 2010

Я знаю, что прошел год с тех пор, как вы задали этот вопрос, но сейчас я сам попал в Старлинг, поэтому до сих пор этого не видел.

Но похоже, что ваша проблема была (из 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 там ...:)

0 голосов
/ 26 августа 2009

Нашел ответ на этот вопрос. Исправление заключается в удалении строки Workling :: Return :: Store.instance из config / environment / development.rb

Затем замените вызовы get и set следующим образом:

В приложении / работники / model_worker.rb:

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

В приложении / controllers / models_controller.rb:

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

Очевидно, есть способ объявить ярлык в environment.rb, чтобы каждый раз не вызывать новый StarlingReturnStore, но я не в себе, потому что не могу заставить это работать.

В любом случае, это исправление работает для меня. Я получаю выходные данные от каждого фонового задания для отправки отчета через набор в контроллер get, который затем захватывается вызовом AJAX и передается на страницу через RJS.

Nice!

...