delayed_pa​​perclip使用ActiveJob而不是Resque

时间:2015-03-22 21:46:18

标签: ruby-on-rails-4 paperclip resque delayed-paperclip

我已配置Delayed::Paperclip以在后台处理回形针附件。我安装并配置了Resque,根据README,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置于顶部时,它可以正常工作。优先级似乎是硬编码的,但我认为如果是这种情况,我不能成为唯一一个遇到此问题的人。这是一个错误还是我错过了什么?

1 个答案:

答案 0 :(得分: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自述文件。