Sidekiq一遍又一遍地重复同样的工作

时间:2013-07-30 11:53:10

标签: carrierwave ruby-on-rails-4 sidekiq

我基本上是在Railscast 383编写项目 - 第二部分,当照片直接上传到AWS S3时,然后Sidekiq在后台处理照片以创建照片的缩略图版本。我在Rails 4上。

我的问题是Sidekiq工作在成功完成后不断重复,而不仅仅是停止。

我哪里错了?我看不出我的代码与Railscast的代码有什么区别,除了我在Rails 4上(如此强大的参数而不是attr_accessible

照片课:

class Photo < ActiveRecord::Base
  mount_uploader :image, ImageUploader

  default_scope order('updated_at DESC')

  after_save :enqueue_image

  def image_name
    File.basename(image.path || image.filename) if image
  end

  def enqueue_image
    ImageWorker.perform_async(id, key) if key.present?
  end
end

ImageWorker:

class ImageWorker
  include Sidekiq::Worker

  sidekiq_options retry: false
  # sidekiq_options retry: 3

  def perform(id, key)
    photo = Photo.find(id)
    photo.key = key
    photo.remote_image_url = photo.image.direct_fog_url(with_path: true)
    photo.save!
    photo.update_column(:image_processed, true)
  end
end

者:

class ImageUploader < CarrierWave::Uploader::Base

  include CarrierWaveDirect::Uploader
  include CarrierWave::RMagick

  # storage :fog
  #### storage defaults to fog when CarrierWaveDirect::Uploader is included ####

  include CarrierWave::MimeTypes
  process :set_content_type

  version :thumb do
    process :resize_to_limit => [200, 200]
  end

  version :medium do
    process :resize_to_limit => [400, 400]
  end

end

1 个答案:

答案 0 :(得分:1)

一次又一次地调用sidekiq worker的一个原因是每次保存照片对象时调用perform_async,这发生在sidekiq worker本身内。 因此,每次调用ImageWorker时,它都会保存照片,再次调用ImageWorker,创建您遇到的循环。

在再次调用:image_processed之前,您确定错过了ImageWorker标记为真的检查。 试试这个:

def enqueue_image
    ImageWorker.perform_async(id, key) if key.present? && !image_processed
end

这将检查图像是否曾经处理过一次。我认为这可能是设置在rails cast中,但是作者忘记了它,否则image_processed标志已经过时了。