Более расширенный контроль над повторной работой. - PullRequest
3 голосов
/ 05 августа 2010

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 06 января 2011

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

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
3 голосов
/ 05 августа 2010

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

...