0

我已经建立了一个Measurement基于MeasurementSettings 运行 s 的系统。每个设置都定义了一个使用ice_cube(以及一些其他测量属性)的计划。我可以为每个设置编辑此时间表,然后使用以下内容轮询下一次发生的事件:

def next_occurrences
  schedule.occurrences(Time.now + 1.day)
end

这给了我一组时间戳,什么时候应该有Measurement.

现在,我还安装了 Sidekiq,我可以使用MeasurementWorker. 为此,我只需创建一个空Measurement记录,将其与其设置相关联,然后perform_async(或perform_at(...))此工作人员:

class MeasurementWorker
  include Sidekiq::Worker
  sidekiq_options retry: 1, backtrace: true

  def perform(measurement_id)
    Measurement.find(measurement_id).run
  end
end

缺少的是我需要根据设置的时间表创建空测量。但是我该怎么做呢?

假设我有以下数据:

  • MeasurementSettingID 为 1,每日计划在 12:00 PM
  • MeasurementSetting使用 ID 2,每小时安排一个完整的小时(12:00 AM、01:00 AM 等)

现在我需要:

  • 创建一个Measurement使用设置 1,每天 12:00
  • 每隔整小时创建一个Measurement使用设置 2 的
  • 打电话给工人进行这些测量

但是怎么做?

我应该每分钟检查一次,是否有MeasurementSetting定义为now发生,然后创建空Measurement记录,然后使用 Sidekiq 以特定设置运行它们?

Measurement或者我应该提前生成带有它们的设置的空记录,并以这种方式安排它们?

实现这一目标的最简单方法是什么?

4

2 回答 2

0

这是我成功的方法:

  • 使用 field 更新应该按计划运行的模型planned_start_time。这将保持计划开始的时间。

  • 使用wheneverGem每分钟运行一个类方法,例如Measurement.run_all_scheduled

  • 在该方法中,检查每个设置(即时间表所在的位置),并检查它现在是否正在发生:

    setting = MeasurementSetting.find(1) # get some setting, choose whatever
    schedule = setting.schedule
    if not schedule.occurring_at? Time.now
      # skip this measurement, since it's not planned to run now
    
  • 如果是这种情况,那么如果没有任何具有相同计划开始时间的先前测量,则通过查看数据库来检查我们是否可以运行测量。所以首先,我们必须获得当前日程的计划开始时间,例如现在是下午 3:04。计划的开始时间可能是下午 3:00。

    this_planned_start_time = schedule.previous_occurrence(Time.now).start_time
    

    然后我们检查最后一次测量的开始时间(limit(1)只得到最后一次)是否相同。

    if Measurement.limit(1).last.planned_start_time != this_planned_start_time
      # skip this one, since it was already run
    
  • 如果没有,我们可以继续设置测量。

    measurement = Measurement.create measurement_setting: setting, 
                                     planed_start_time: this_planned_start_time
    
  • 然后运行它:

    measurement.delay.run
    
于 2014-12-12T07:05:40.940 回答
0

我会每分钟使用 cron 来查找现在应该运行的 MeasurementSettings。如果是,请创建一个 Sidekiq 作业以立即运行以填充测量。

于 2014-08-13T16:32:21.060 回答