我已配置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置于顶部时,它可以正常工作。优先级似乎是硬编码的,但我认为如果是这种情况,我不能成为唯一一个遇到此问题的人。这是一个错误还是我错过了什么?
答案 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自述文件。