2010-08-05 5 views
3

Так что я использую Delayed :: Job работники (на Heroku) в качестве обратного вызова after_create после того, как пользователь создает определенную модель.Более продвинутый контроль над замедленными рабочими рабочими повторить

Общепринятый вариант использования, однако, оказывается, для пользователей что-то создавать, а затем сразу удалить его (вероятно, потому, что они допустили ошибку или что-то еще).

Когда это происходит, рабочие активируются, но к тому времени, когда они запрашивают модель под рукой, она уже удалена, НО из-за функции автоматического повтора эта злополучная работа будет повторять 25 раз, и определенно никогда не работает.

Есть ли способ поймать определенные ошибки и, когда они произойдут, предотвратить повторное повторение задания, но если это не ошибка, в будущем он повторит попытку?

ответ

3

Сообщите нам об изменениях в функции, которую вы вызываете с помощью delayed_job. Сделайте соответствующие проверки, чтобы ваша желаемая работа могла продолжить или нет, и либо работать над этой работой, либо возвращать успех.

3

Чтобы расширить ответ Давида, вместо того, чтобы сделать это:

def after_create 
    self.send_later :spam_this_user 
end 

Я хотел бы сделать это:

# user.rb 

def after_create 
    Delayed::Job.enqueue SendWelcomeEmailJob.new(self.id) 
end 

# send_welcome_email_job.rb 

class SendWelcomeEmailJob < Struct(:user_id) 
    def perform 
     user = User.find_by_id(self.user_id) 
     return if user.nil? #user must have been deleted 

     # do stuff with user 
    end 
end 
+0

Но это отвратительный, по сравнению с их иначе прекрасный нон-воздействуя дизайн :) Я Угадайте еще один реальный вопрос: неужели 25 неудач действительно вызывают проблемы? – Kevin

+1

Работы должны быть устойчивыми к ошибкам и быть перезапускаемыми. Если это не так, вы должны либо: а) пересмотреть дизайн отложенного задания, либо б) убедиться, что задание понимает, какие ошибки он может «обрабатывать» и делать соответствующую вещь. Возможно, чтобы он молча вышел, чтобы избежать ошибки, вызвавшей повторный запуск. –