ruby-on-railsscheduled-taskssidekiqice-cube

How to schedule Sidekiq jobs according to a recurring schedule in database?


I've set up a system where Measurements are run based on MeasurementSettings. Each setting defines a schedule using ice_cube (and some other properties for measurements). I'm able to edit this schedule for each setting and then poll for the next occurrences with something like:

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

This gives me a set of timestamps when there should be a Measurement.

Now, I also have Sidekiq installed, and I can successfully run a measurement at a specific time using a MeasurementWorker. To do that, I just create an empty Measurement record, associate it with its settings, and then perform_async (or perform_at(...)) this worker:

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

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

What's missing is that I somehow need to create the empty measurements based on a setting's schedule. But how do I do this?

Say I have the following data:

Now I need to:

But how?

Should I check, say every minute, whether there is a MeasurementSetting that is defined to occur now, and then create the empty Measurement records, then run them with the specific setting using Sidekiq?

Or should I generate the empty Measurement records with their settings in advance, and schedule them this way?

What would be the simplest way to achieve this?


Solution

  • Here's how I successfully did it: