2015-06-01 3 views
4

Если нужно создать ActiveJob, а блок выполнения принимает аргумент, который, как ожидается, будет единственным экземпляром объекта ActiveRecord, тогда, когда задание находится в очереди, этот объект существует, но при фактическом времени выполнения этого объекта нет дольше существует, работа, очевидно, потерпит неудачу, не так ли?Что происходит, когда вы передаете объект в очередь ActiveJob и этот объект больше не существует во время выполнения?

MyJob < ActiveJob::Base 
    def perform(widget) 
    # do some stuff to widget 
    end 
end 

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

Вне решения проблемы, я узнал здесь, что было бы лучше передать целое число widget_id, а не объект ActiveRecord. Тогда я мог бы проверить и посмотреть, существует ли видимый виджет внутри блока выполнения.

+0

Упоминается здесь: https://github.com/rails/rails/issues/19793 – Shadwell

ответ

4

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

Так, в классе работы вы можете добавить:

class MyJob < ActiveJob::Base 

    rescue_from(ActiveJob::DeserializationError) do |exception| 
    # return true (we rescued) if the error causing the deserialization 
    # error was a record not being found 
    exception.original_exception == ActiveRecord::RecordNotFound 
    end 
end 

If rescue_from возвращает true это указывает на то, что ошибка было обработано и что работа завершена успешно. В этом случае я только что проверил, была ли ошибка, вызвавшая ошибку десериализации, ActiveRecord::RecordNotFound (это то, что globalid gem, которое использует ActiveJob для сериализации и десериализации объектов ActiveRecord, когда он не может найти объект).

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

  • Нет связанных вопросов^_^