3

我已将Delayed::Paperclip配置为在后台处理 Paperclip 附件。我安装并配置了 Resque,根据自述文件,Resque 现在应该处理后台任务:

确保您已启动并运行 Resque。作业将被分派到 :paperclip 队列,因此您可以正确分派您的工作人员。完全按照您的方式配置 resque 和您的工作人员。

然而,另一个用于运行后台任务的框架 Active Job 是作为 Rails 4.1/ActionMailer 的依赖项安装的,它从 Resque 中“窃取”了任务。

 [ActiveJob] Enqueued DelayedPaperclip::Jobs::ActiveJob (Job ID: ba60f576-e544-4f53-8db2-eb0085f1f653) to Inline(paperclip) with arguments: "Photo", 79, "picture"

问题是 Active Job 似乎立即在同一个线程中运行 - 基本上它根本不在后台运行。

我检查了 Delayed::Paperclip 的代码,似乎已安装的后端有优先级:

def detect_background_task
  return DelayedPaperclip::Jobs::ActiveJob  if defined? ::ActiveJob::Base
  return DelayedPaperclip::Jobs::DelayedJob if defined? ::Delayed::Job
  return DelayedPaperclip::Jobs::Resque     if defined? ::Resque
  return DelayedPaperclip::Jobs::Sidekiq    if defined? ::Sidekiq
end

当我切换它们并将 Resque 放在上面时,它就可以工作了。优先级似乎是硬编码的,但我认为如果是这样的话,我不能是唯一一个遇到这个问题的人。这是一个错误还是我错过了什么?

4

1 回答 1

3

Active Job实际上是一个非常好的主要选择,因为它充当抽象层:

Active Job 是一个用于声明作业并使它们在各种排队后端运行的框架。[...] 重点是确保所有 Rails 应用程序都有一个工作基础设施,即使它是“即时运行器”的形式。

默认是立即运行任务,但也可以选择其他后端。这些后端之一是 Resque。因此,您唯一需要做的就是将 Active Job 配置为使用 Resque:Delayed::Paperclip → Active Job → Resque。只需将其放入您的application.rb

module MyApp
  class Application < Rails::Application
    ...
    config.active_job.queue_adapter = :resque
  end
end

Delayed::Paperclip 自述文件可能应该更新。

于 2015-03-22T21:46:18.203 回答