使用 Sidekiq Scheduler 处理作业

Process jobs with Sidekiq Scheduler

提问人:teddybear 提问时间:6/25/2023 最后编辑:teddybear 更新时间:6/25/2023 访问量:186

问:

我不确定我的 Sidekiq Scheduler 设置缺少什么。我可以手动处理作业,但计划的作业未运行。从 Web UI 中按可正确运行作业。以 sidekiq 开头,显示 Schedules LoadedEnqueue Nowbundle exec sidekiq

宝石文件

gem 'sidekiq', '~> 6.5.4'
gem 'sidekiq-scheduler', '~> 5.0.3'

config/initializers/sidekiq.rb

if Rails.env.test?
  require 'sidekiq/testing'

  Sidekiq::Testing.fake!
else
  Sidekiq.configure_server do |config|
    config.average_scheduled_poll_interval = 5
    config.on(:startup) do
      SidekiqScheduleManager::StartupManager.call
      Sidekiq.schedule = Sidekiq.get_all_schedules
    end
  end
  Sidekiq.configure_client do |config|
    config.average_scheduled_poll_interval = 5
  end
end

创建计划

def schedule_this(day)
  # Convert seconds since midnight to a time string,
  # The current time doesn't matter, we just need the time at the beginning of the day
  time = (Time.current.beginning_of_day + daily_schedule[day].seconds).strftime('%H:%M')
  # Schedule the job
  Sidekiq.set_schedule(
    "notify_#{member.id}_#{day}",
    schedule_arg(day, time, member)
  )
end

def schedule_arg(day, time, member)
  {
    # 'every' => ['1w', { 'first_at' => "#{day.capitalize} #{time}" }],
    # 'every' => "#{day} at #{time}",
    # 'every' => ['1w', { 'first_in' => "#{day} at #{time}" }],
    'cron' => Fugit::Nat.parse("every #{day} at #{time}").original,
    'class' => 'WaveJob',
    'args' => schedule_args_args(member)
  }
end

set_schedule生成这样的记录

{"notify_649754255af1d03b3aecba50_monday"=>{"cron"=>"0 9 * * 1", "class"=>"WaveJob", "args"=>"[some_json]"},

更新 - 添加到块可立即处理作业,但编辑记录的 cron 字符串不会再次更新计划。从控制台重新运行表示 SidekiqScheduler 已禁用。Sidekiq::Scheduler.reload_schedule!:startupreload_schedule!

更新 - 已修复。在街区中也只需要Sidekiq::Scheduler.dynamic = true:startup

Sidekiq Ruby-on-Rails-7 Ruby-3

评论


答: 暂无答案