【问题标题】:Workling return store not retrieving value from set工作返回商店未从集合中检索值
【发布时间】:2023-03-31 14:00:02
【问题描述】:

在我的 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 将恢复为 Spawn 而不是 Starling。)

所以问题是我在 background_complete 的这一行得到了 nil:

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

【问题讨论】:

    标签: ruby starling-server


    【解决方案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
    

    至少为了那些谷歌搜索者的利益...... :)

    【讨论】:

      【解决方案2】:

      找到了这个问题的答案。解决方法是从 config/environments/development.rb 中删除 Workling::Return::Store.instance 行

      然后替换get AND set调用如下:

      在 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) 
      

      显然,有一种方法可以在 environment.rb 中声明一个快捷方式,以避免每次都调用一个新的 StarlingReturnStore,但我无法做到这一点,因为我无法做到这一点。

      无论如何,这个修复对我有用。我将每个后台作业的输出通过设置为控制器中的 get 进行报告,然后由 AJAX 调用捕获并通过 RJS 报告给页面。

      不错!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-11
        • 2020-11-23
        • 2023-03-21
        • 2012-08-03
        • 2017-02-04
        • 2013-08-22
        • 2019-07-11
        • 2021-06-10
        相关资源
        最近更新 更多