I've set up a system where Measurement
s are run based on MeasurementSetting
s. 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:
MeasurementSetting
with ID 1, with a daily schedule at 12:00 PMMeasurementSetting
with ID 2, with an hourly schedule at every full hour (12:00 AM, 01:00 AM, etc.)
Now I need to:
- Create a
Measurement
that uses setting 1, every day at 12:00 - Create a
Measurement
that uses setting 2, every full hour - Call the worker for these measurements
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?