[英]How to schedule Sidekiq jobs according to a recurring schedule in database?
我已經設置了其中系統Measurement
s的基礎上運行MeasurementSetting
秒。 每個設置都使用ice_cube
(以及一些其他用於測量的屬性)定義時間表。 我可以為每個設置編輯此計划,然后使用類似以下內容來輪詢下次出現的情況:
def next_occurrences
schedule.occurrences(Time.now + 1.day)
end
這給了我應該Measurement
的時間戳。
現在,我還安裝了Sidekiq,並且可以使用MeasurementWorker
在特定時間成功運行MeasurementWorker
。 為此,我只需創建一個空的Measurement
記錄,並將其與其設置相關聯,然后執行此worker的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
缺少的是,我需要以某種方式根據設置的時間表創建空測量。 但是我該怎么做呢?
說我有以下數據:
MeasurementSetting
,每日計划為12:00 PM MeasurementSetting
,每個小時(每小時12:00 AM,01:00 AM等)按小時計划 現在我需要:
Measurement
,每天12:00 Measurement
但是如何?
我應該每分鍾檢查一次,是否有一個定義為現在發生的MeasurementSetting
,然后創建空的Measurement
記錄,然后使用Sidekiq使用特定設置運行它們?
還是應該預先生成空的Measurement
記錄及其設置,並以這種方式安排它們?
實現這一目標的最簡單方法是什么?
我會每分鍾使用cron來查找應該立即運行的MeasurementSettings。 如果是,請創建一個Sidekiq作業以立即運行,以填充“測量”。
這是我成功完成的方式:
使用字段planned_start_time
更新應按計划運行的模型。 這將保留計划開始的時間。
使用whenever
創業板運行一類方法的每一分鍾,如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 PM。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.