From 3bf4dd18e3df9fe0a298d1970e7cc49a77896afe Mon Sep 17 00:00:00 2001 From: James Herdman Date: Mon, 25 Nov 2024 21:04:08 -0500 Subject: [PATCH] Error When an Invalid Recurring Task is Configured Resolves #414 --- lib/solid_queue/scheduler.rb | 10 +++++++++- lib/solid_queue/scheduler/recurring_schedule.rb | 8 ++++++-- test/unit/scheduler_test.rb | 10 ++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/solid_queue/scheduler.rb b/lib/solid_queue/scheduler.rb index da83bbd3..eb16ed75 100644 --- a/lib/solid_queue/scheduler.rb +++ b/lib/solid_queue/scheduler.rb @@ -35,7 +35,15 @@ def run end def schedule_recurring_tasks - recurring_schedule.schedule_tasks + if recurring_schedule.valid? + recurring_schedule.schedule_tasks + else + error_messages = recurring_schedule.invalid_tasks.map do |task| + "#{task.key}: #{task.errors.full_messages.to_sentence}" + end.join(", ") + + raise "Invalid recurring tasks: #{error_messages}" + end end def unschedule_recurring_tasks diff --git a/lib/solid_queue/scheduler/recurring_schedule.rb b/lib/solid_queue/scheduler/recurring_schedule.rb index 5b8ff6bb..668ce6c7 100644 --- a/lib/solid_queue/scheduler/recurring_schedule.rb +++ b/lib/solid_queue/scheduler/recurring_schedule.rb @@ -4,10 +4,10 @@ module SolidQueue class Scheduler::RecurringSchedule include AppExecutor - attr_reader :configured_tasks, :scheduled_tasks + attr_reader :configured_tasks, :invalid_tasks, :scheduled_tasks def initialize(tasks) - @configured_tasks = Array(tasks).map { |task| SolidQueue::RecurringTask.wrap(task) }.select(&:valid?) + @configured_tasks, @invalid_tasks = Array(tasks).map { |task| SolidQueue::RecurringTask.wrap(task) }.partition(&:valid?) @scheduled_tasks = Concurrent::Hash.new end @@ -15,6 +15,10 @@ def empty? configured_tasks.empty? end + def valid? + invalid_tasks.empty? + end + def schedule_tasks wrap_in_app_executor do persist_tasks diff --git a/test/unit/scheduler_test.rb b/test/unit/scheduler_test.rb index 9478b9f1..dcf6a45d 100644 --- a/test/unit/scheduler_test.rb +++ b/test/unit/scheduler_test.rb @@ -17,6 +17,16 @@ class SchedulerTest < ActiveSupport::TestCase scheduler.stop end + test "recurring schedule has an invalid task" do + invalid_recurring_tasks = { example_task: { class: "BarBarBarBarJob", schedule: "every hour", args: 42 } } + + error = assert_raises(RuntimeError) do + SolidQueue::Scheduler.new(recurring_tasks: invalid_recurring_tasks).tap(&:start) + end + + assert_equal "Invalid recurring tasks: example_task: Class name doesn't correspond to an existing class", error.message + end + test "run more than one instance of the scheduler with recurring tasks" do recurring_tasks = { example_task: { class: "AddToBufferJob", schedule: "every second", args: 42 } } schedulers = 2.times.collect do