簡體   English   中英

如何根據數據庫中的重復計划安排Sidekiq作業?

[英]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

缺少的是,我需要以某種方式根據設置的時間表創建空測量。 但是我該怎么做呢?

說我有以下數據:

  • ID為1的MeasurementSetting ,每日計划為12:00 PM
  • ID為2的MeasurementSetting ,每個小時(每小時12:00 AM,01:00 AM等)按小時計划

現在我需要:

  • 創建一個使用設置1的Measurement ,每天12:00
  • 每小時創建一個使用設置2的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM