如何在一个月的特定时段创建幂等工作?

时间:2017-02-01 02:14:12

标签: ruby-on-rails ruby ruby-on-rails-5 jobs

我的应用程序中有很多工作,它们具有以下条件:

  • 需要每月执行一次,每月只执行一次
  • 需要在特定日期执行操作(例如:月末前10天)
  • 作业将每天重复运行多次,因此它们必须是幂等的,并且可以多次重新运行并且只影响特定记录,直到下个月,在这种情况下所有记录都可以再次生效

想想通过短信在月底前5天发出的付款提醒。

我可以想到很多方法可以做到这一点,但老实说,我尝试的每一种方式都会因为不同的时间减法,.where()子句等而超级混乱。

我真的在寻找一种已知的设计模式或一些防弹逻辑,这些逻辑并不会让意大利面乱糟糟的时间减少,更大,更少,并且让人感到困惑at(并且容易出错)

这是我最好的尝试。请随时帮助我从头开始......但它不需要修改它。我觉得这比现在要复杂得多。

class SMSPaymentReminderJob < Que::Job

  @priority = 50

  def run
    current = Time.now.in_time_zone('America/New_York')
    window_end = current.end_of_month
    window_start = window_end.beginning_of_day - 2.days
    cutoff = current.beginning_of_month.utc # convert to UTC for PG

    return unless (window_start..window_end).cover? current

    User.where(sms_enabled: true)
      .where('"sms_reminder_sent_at" < ? OR "sms_reminder_sent_at" IS NULL', cutoff)
      .find_in_batches(batch_size: 30) do |users|

      # ... code here ...
    end
  end

end

1 个答案:

答案 0 :(得分:0)

IceCube(处理重复事件)和GUI RecurringSelect的组合可以实现这一点,并且易于使用并允许扩展。

然后,您可以设置您的活动,例如:

IceCube::Rule.monthly
IceCube::Rule.monthly.day_of_month(-10)