Resque - 未定义类的'perform'方法

7
我目前在后台队列方面没有什么好运气。我正在尝试让Resque工作。我已经安装了redis和Resque宝石。
Redis正在运行,一个worker正在运行(rake resque:work QUEUE = simple)。使用web界面,我可以看到worker正在运行并等待工作。
当我运行'rake get_updates'时,作业排队但失败了。我已经尝试过def self.perform和def perform两种方式。 clockwork.rake
task :get_updates => :environment do
    Resque.enqueue(GetUpdates)
end

类文件(app/workers/get_updates.rb)

class GetUpdates
    @queue = :simple

    def perform

        puts "Running GetUpdates"

    end

end

错误信息

undefined method `perform' for GetUpdates:Class
/Users/lukesmith/.rvm/gems/ruby-1.9.3-p327/bundler/gems/resque-620d354454b8/lib/resque/job_performer.rb:79:in `perform_job'
/Users/lukesmith/.rvm/gems/ruby-1.9.3-p327/bundler/gems/resque-620d354454b8/lib/resque/job_performer.rb:46:in `execute_job'
/Users/lukesmith/.rvm/gems/ruby-1.9.3-p327/bundler/gems/resque-620d354454b8/lib/resque/job_performer.rb:25:in `perform' 
2个回答

12

perform 方法应该是类实例方法。

class GetUpdates
  @queue = :simple

  def self.perform
    puts "Running GetUpdates"
  end

end

抱歉打断一下,我认为楼主已经提到他也尝试过self.perform了。 - Vamsi Krishna
我可能有些失误。在将其更改为self.perform后,我重新启动了redis和resque,现在似乎可以工作了。任务还没有达到我想要的效果,但不再出错了。干杯。 - Luke Smith
很高兴您的问题已经解决。正如Tulentsev所建议的那样,它应该是一个类实例方法。请接受您认为合适的任何答案,以便对其他用户有所帮助。 - Vamsi Krishna
@VamsiKrishna:啊,我没有注意到。但肯定是造成这个问题的原因 :) - Sergio Tulentsev
1
是的,我同意你的看法 @SergioTulentsev:我在下一条评论中也提到了这个。 - Vamsi Krishna
1
我也遇到了同样的问题。解决方法肯定是将其更改为self.perform,但这对我来说并没有立即生效(即使杀死了所有相关进程)。最终起作用的是进入http://localhost:3000/resque/failed并删除失败的作业,然后重新启动所有进程。我不确定这是否仅仅是时间问题,但至少现在一切都正常了!谢谢大家。 - staxim

1

你尝试过在将方法更改为self.perform后重新启动resque吗?在更改方法名称为self.perform后退出rake resque并重新启动。这应该可以确保正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接