2010-07-15 3 views
3

мне нужно обновить модель после delayed_job обрабатывает задачу на нем, например:Обратный вызов после процесса delayed_job работы

foo.delay.something

После something делается, мне нужно обновить объект Foo, что является лучшим способ достичь этого? Я думал о кодировании обратного вызова в классе Delayed::Backend::ActiveRecord::Job, но для этого должно быть что-то более чистое и лучшее.

ответ

3

Я только что обновил его в конце метода #foo:

def foo 
    # do work here 
    update_attribute :processed, true 
end 
1

Я не понимаю, почему вы не сделали бы это как часть задания, которое уже действует на объект.

+0

Да я мог 'delay' всего потока, но я хотел бы знать, как вызвать' after_processed' обратного вызова. – jpemberthy

+0

У меня такая же ситуация, но в моем случае она работает только в очереди на другую работу в конце первого. Также важно отметить, что создаваемые задания являются объектами ActiveRecord, поэтому, если вы хотите добавить обратные вызовы жизненного цикла, вы можете сделать это. –

+0

Привет, лично, для этого конкретного случая, мне больше нравится идея добавления обратных вызовов к экземплярам Job, а не для задания задания за другим. Итак, я собираюсь выполнить обратный вызов в экземплярах Job :) – jpemberthy

0

обновление записи, как это предлагается в порядке, но это только часть решения ...

обратный вызов будет поможет, если я хочу больше контроля о том, что делать, если это не удается .. то есть:

Delayed::Job.enqueue InstructionRequestJob.new(p1, p2) 

InstructionRequestJob perform 
- perform a task on a remote server 
- get a response 
- case response 
    when OK 
    update attribute (as suggested) 
    else 
    # how many attempts ? 
    if too_many_attempts 
     update attribute 
     destroy the job 
    else 
     reschedule the job for another attempt 
- end 
Смежные вопросы