Delayed::Job
- это модель < ActiveRecord::Base
, поэтому вы можете запросить ее, как обычно, как Delayed::Job.all(:conditions => {:last_error => nil})
.
Объекты Delayed :: Job имеют поле полезной нагрузки, которое содержит сериализованную версию метода или задания, которое вы пытаетесь запустить. Доступ к этому объекту осуществляется с помощью их метода #payload_object, который загружает рассматриваемый объект.
Вы можете объединить эти две возможности, чтобы сделать работоспособных работников, например, если у вас есть модель User
, а у пользователя есть скрепка :avatar
, то вы можете создать метод для удаления необработанных работ, например так:
class User < ActiveRecord::Base
has_attached_file :avatar, PaperclipOptions.new(:avatar)
before_create :'process_avatar_later'
def process_avatar_later
filename = Rails.root.join('tmp/avatars_for_processing/',self.id)
open(filename, 'w') do |file| file <<self.avatar.to_file end
Delayed::Job.enqueue(WorkAvatar.new(self.id, filename))
self.avatar = nil
end
def cancel_future_avatar_processing
WorkAvatar.future_jobs_for_user(self.id).each(&:destroy)
#ummm... tell them to reupload their avatar, I guess?
end
class WorkAvatar < Struct.new(:user_id, :path)
def user
@user ||= User.find(self.user_id)
end
def self.all_jobs
Delayed::Job.scoped(:conditions => 'payload like "%WorkAvatar%"')
end
def self.future_jobs_for_user(user_id)
all_jobs.scoped(:conditions => {:locked_at => nil}).select do |job|
job.payload_object.user_id == user_id
end
end
def perform
@user.avatar = File.open(path, 'rb')
@user.save()
end
end
end
Возможно, кто-то сделал плагин для создания запрашиваемых объектов, подобных этому. Возможно, поиск на GitHub будет плодотворным.
Обратите внимание, что вам придется работать с любыми инструментами мониторинга процессов, вам может потребоваться отменить все выполняющиеся рабочие процессы рабочих процессов, которые выполняются, если вы хотите отменить работу, для которой установлены locked_at
и locked_by
. 1017 *