Ruby on rails 如何根据数据库中的循环计划安排Sidekiq作业?

Ruby on rails 如何根据数据库中的循环计划安排Sidekiq作业?,ruby-on-rails,scheduled-tasks,sidekiq,ice-cube,Ruby On Rails,Scheduled Tasks,Sidekiq,Ice Cube,我已经建立了一个系统,在这个系统中,测量是基于测量设置运行的。每个设置使用ice_cube和其他一些测量属性定义明细表。我可以为每个设置编辑此计划,然后使用以下内容轮询下一个事件: def next_occurrences schedule.occurrences(Time.now + 1.day) end 这给了我一组应该进行测量的时间戳 measurement = Measurement.create measurement_setting: setting,

我已经建立了一个系统,在这个系统中,测量是基于测量设置运行的。每个设置使用ice_cube和其他一些测量属性定义明细表。我可以为每个设置编辑此计划,然后使用以下内容轮询下一个事件:

def next_occurrences
  schedule.occurrences(Time.now + 1.day)
end
这给了我一组应该进行测量的时间戳

measurement = Measurement.create measurement_setting: setting, 
                                 planed_start_time: this_planned_start_time
现在,我也安装了Sidekiq,我可以使用MeasurementWorker在特定时间成功运行测量。为此,我只需创建一个空的测量记录,将其与其设置关联,然后执行异步或在。。。这位工人:

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

  def perform(measurement_id)
    Measurement.find(measurement_id).run
  end
end
缺少的是,我需要根据设置的时间表创建空测量值。但是我该怎么做呢

假设我有以下数据:

ID为1的测量设置,每日计划为下午12:00 ID为2的测量设置,每整小时12:00 AM、01:00 AM等有一个小时时间表。 现在我需要:

创建使用设置1的测量值,每天12:00 每满一小时创建一个使用设置2的测量值 打电话给工人进行这些测量 但是怎么做呢

我是否应该检查(比如每分钟检查一次)是否存在定义为现在发生的测量设置,然后创建空的测量记录,然后使用Sidekiq以特定设置运行它们

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


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

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

以下是我如何成功完成的:

measurement = Measurement.create measurement_setting: setting, 
                                 planed_start_time: this_planned_start_time
使用“计划开始时间”字段更新应按计划运行的模型。这将保留计划在开始时的时间

使用每分钟运行一次类方法,例如Measurement.run\u all\u 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点

this_planned_start_time = schedule.previous_occurrence(Time.now).start_time
然后我们检查最后一次测量的开始时间限制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

我想无论什么时候在这里都会派上用场。但是我该如何计时呢,比如说,当我让cron在下午12:00运行时,然后检查设置是否在某个时间发生。现在,我会看到它应该运行,然后开始测量。但在下午12:01,同样的测量仍在进行。在使用ice_cube和Sidekiq之间的交互之前,有没有办法捕捉到这一点?或者我是否应该检查自己是否已经在运行此精确设置的测量?防止测量值堆积是计划作业的常见问题。没有简单的解决办法。