3

バックグラウンドで 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を上に置くと、うまくいきます。優先度はハードコーディングされているようですが、そうであれば、この問題を抱えているのは私だけではないと思います。これはバグですか、それとも何か不足していますか?

4

1 に答える 1

3

Active Jobは、抽象化レイヤーとして機能するため、実際には非常に優れた主要な選択肢です。

Active Job は、ジョブを宣言し、さまざまなキューイング バックエンドで実行するためのフレームワークです。[...] 重要な点は、たとえ「即時ランナー」の形であっても、すべての Rails アプリにジョブ インフラストラクチャが用意されていることを確認することです。

デフォルトではタスクをすぐに実行しますが、他のバックエンドも選択できます。これらのバックエンドの 1 つが Resque です。したがって、Resque を使用するように Active Job を構成するだけです: Delayed::Paperclip → Active Job → Resque。これをあなたの中に入れてくださいapplication.rb

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

Delayed::Paperclip README はおそらく更新されるはずです。

于 2015-03-22T21:46:18.203 に答える