【问题标题】:Resque starts jobs, but do nothingResque 开始工作,但什么也不做
【发布时间】:2017-11-01 21:06:07
【问题描述】:

我正在使用 resque 做一些(长时间的)工作。而且我有一些具有相同混合模块的类用于排队。类服务替代测试,这就是它独立且(可能太复杂)的原因。所以故事发生在我打电话的时候

Campaign.perform(user_id)

直接,一切正常,但是当我尝试使用队列时:

Resque.enqueue(Campaign, user_id)

已创建工作,但似乎无所事事。至少,没有任何东西保存到数据库中。这是 Campaign 类的主要任务。我可以在 resque-web-interface 中看到作业创建并完成,并完成(快速,几乎在创建之后)但没有结果。

我是 Resque 的新手,并不确定它是否全部调用(对如何调试感到困惑)。

有人有类似的问题吗?感谢您的帮助。

模块:

module Synchronisable
  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    def perform(user_id)
      save_objects("#{self.name}::Service".constantize.get_objects(user_id))
    end

    protected

    def save_objects(objects)
      raise ArgumentError "should be implemented"
    end
  end

  class Service
    def self.get_objects(user)
      raise ArgumentError "should be implemented"
    end
  end
end

其中一类:

class Campaign < ActiveRecord::Base
  include Synchronisable
  @queue = :app

  class << self
     protected 
       def save_objects(objects)
         #some stuff to save objects
       end

  end
  class Service
    def self.get_objects(user_id)
      #some stuff to get objects
    end
  end
end

【问题讨论】:

  • 我也有同样的问题。作业进入队列,但大多数时候不运行。偶尔它确实有效。

标签: ruby-on-rails ruby queue resque


【解决方案1】:

这是一个非常古老的问题,所以不确定当时的 rails 文件夹结构如何,但我遇到了同样的问题,问题在于继承。似乎您使用的是 Resque,您的作业类不应该从 ApplicationJob 继承。

所以如果您的代码在 (app/jobs/campaign_job.rb) 中是这样的:

class Campaign < ApplicationJob
  @queue = :a_job_queue
  def self.perform
     #some background job
  end
end

然后删除继承,即“

【讨论】:

  • 2021 年 4 月,我遇到了同样的问题:为 Resque 配置的 Rails 6 ActiveJob(遵循 Rails Guides 示例)让 Resque 静默失败。没有错误消息,一切看起来都很正常,除了作业没有被执行。所以我将 Job 类语法从 Rails 的 ActiveJob 示例切换到 Resque 语法(关于:类继承、队列、执行),一切正常。感谢您的提示!
  • 我不知道发生了什么,但我遇到了同样的问题...
【解决方案2】:

由于异常,这些作业几乎肯定会失败。什么是 resque-web 在“失败”选项卡上向您展示的内容?您也可以通过以下方式从 Rails 控制台获取:

Resque.info

Resque::Failure.all(0)

【讨论】:

  • 正如我在问题中所说,问题是我的工作看起来根本没有开始。没有错误或异常(它们不会出现在“失败”选项卡中)。但也无所作为。我尝试使用命令 Resque.enqueue(Сampaign, user.id) 手动启动它们
  • 你能给我们指出一个 api-doc 或类似的东西吗?我真的是 resque 的新手,需要调查一些失败。
  • @Ramy,在代码中浏览一下;现实中并没有太多。您可能会更好地启动 resque-web 和浏览,如 README 中所示,但是:github.com/defunkt/resque/blob/master/README.markdown
【解决方案3】:

你应该像这样运行你的工人:

nohup QUEUE=* rake resque:work & &> log/resque_worker_QUEUE.log

这会将您调试的所有内容输出到“log/resque_worker_QUEUE.log”,您将能够找出您的 Campaign 类有什么问题。

【讨论】:

  • hm,在这之后我的 resque_worker_QUEUE.log 只有一个空行 - 当我的工作开始/完成时仍然没有发生任何事情
【解决方案4】:

试试这个:

env TERM_CHILD=1 COUNT=2 "QUEUE=*" bundle exec rake resque:workers

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 2010-11-29
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多