2014-02-05 3 views
0

У меня есть задача delayed_job, которая выплевывает файл. Я хотел бы иметь возможность префикс файла с идентификатором созданного им задания, чтобы легко ссылаться на него позже.Ссылка на идентификатор задания delayed_job из заданий задания

# Create a file that has the job id in the name... 
job_id = thing.delay.create_file 
# Now we'll use the job_id to search for the file... 

Возможно ли это?

+0

Укажите код в задаче create_file. – eabraham

+0

@ eabraham- почему? – Yarin

+0

DJ удаляет записи, когда это делается с ними, и как ваш идентификатор задания вам подходит? –

ответ

1

Давайте отсюда ...

class WriteFileJob 
    attr_accessor :dj_id, :file_name 

    def initialize(file_name) 
    @file_name = file_name 
    end 

    def perform 
    # do something with @dj_id; don't worry, we'll set it below 
    end 
end 

Теперь, когда вы епдиеие работу, вы должны получить работу обратно:

j = Delayed::Job.enqueue(WriteFileJob.new("foo.txt")) 

Далее вы загрузите объект, который поставлен в очередь, и обновлять его с идентификатором вы только что вернулись:

object_to_update = YAML.load(j.handler) 
object_to_update.dj_id = j.id 
# update the handler 
j.handler = object_to_update.to_yaml 
j.save 
+0

@ Abdo- Smart! благодаря! – Yarin

+0

@Yarin :-) В случае, если вас беспокоит работа, выполняемая слишком рано (до того, как назначается @dj_id), вы можете выбросить исключение 'if @ dj_id.nil?', Чтобы работа снова запустилась позже (или вы можете указать run_at в начале) – Abdo

1

delayed_job использует таблицу для работы в очереди, и эту таблицу можно найти в Gem's migration file. Эта таблица будет иметь столбец с идентификатором по умолчанию, которые вы можете запросить для:

ActiveRecord::Base.connection.raw_connection.prepare("Select id FROM delayed_job where handler=?","YAML Encoded string representing the object doing work") 
+0

Спасибо, это сработает, хотя я надеюсь на что-то, что не связано с повторным запросом db. – Yarin

Смежные вопросы