首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作返回存储未从集合中检索值

工作返回存储未从集合中检索值
EN

Stack Overflow用户
提问于 2009-08-25 12:57:25
回答 2查看 274关注 0票数 0

在我的应用程序中,我有(为了保护无辜者而更改的模型/方法的名称):

代码语言:javascript
复制
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/worker/model_worker.rb中:

代码语言:javascript
复制
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,我有一个原型帮助器,它轮询对同一个控制器的请求,以确定后台作业是否完成:

代码语言:javascript
复制
<%= periodically_call_remote( :url => { :action => :background_complete }, :frequency => 5, :update => 'status_div') %>

在apps/controller/model_controller er.rb中,用于检查后台作业状态的函数:

代码语言:javascript
复制
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/environment/development.rb中:

代码语言:javascript
复制
Workling::Return::Store.instance = Workling::Return::Store::MemoryReturnStore.new
Workling::Remote.dispatcher = Workling::Remote::Runners::StarlingRunner.new

(请注意,我已经尝试过在注释和不注释最后一行的情况下运行这段代码。如果将其注释掉,工作将恢复为产卵,而不是Starling。)

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

代码语言:javascript
复制
@result = Workling::Return::Store.get(task.process_id) #=> nil
EN

回答 2

Stack Overflow用户

发布于 2010-08-24 22:08:01

我知道你问这个问题已经有一年了,但我自己才刚开始接触Starling,所以直到现在才看到这一点。

但看起来你的问题是(来自development.rb):

代码语言:javascript
复制
Workling::Return::Store.instance = Workling::Return::Store::MemoryReturnStore.new
Workling::Remote.dispatcher = Workling::Remote::Runners::StarlingRunner.new

它需要是:

代码语言:javascript
复制
Workling::Return::Store.instance = Workling::Return::Store::StarlingReturnStore.new
Workling::Remote.dispatcher = Workling::Remote::Runners::StarlingRunner.new

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

票数 1
EN

Stack Overflow用户

发布于 2009-08-26 00:10:31

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

然后替换get和set调用,如下所示:

在app/worker/model_worker.rb中:

代码语言:javascript
复制
store = Workling::Return::Store::StarlingReturnStore.new
key, value = @uid, @progress
store.set(key, value)

在应用程序/控制器/models_Controler.rb中:

代码语言:javascript
复制
store = Workling::Return::Store::StarlingReturnStore.new
@result = store.get(task.process_id) 

显然,有一种方法可以在environments.rb中声明一个快捷方式,以避免每次都调用一个新的StarlingReturnStore,但是我已经超出了我的能力范围,因为我无法做到这一点。

不管怎样,这个修复方法对我很有效。我将每个后台作业的输出通过set报告给控制器中的get,然后通过AJAX调用捕获它,并通过RJS将其报告给页面。

好的!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1328125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档