diff --git a/lib/solid_queue/configuration.rb b/lib/solid_queue/configuration.rb index 18f833ab..18e608d1 100644 --- a/lib/solid_queue/configuration.rb +++ b/lib/solid_queue/configuration.rb @@ -208,7 +208,7 @@ def dispatchers def schedulers return [] if skip_recurring_tasks? - if recurring_tasks.any? || dynamic_recurring_tasks_enabled? + if recurring_tasks.any? || dynamic_recurring_tasks_enabled? || static_recurring_tasks_exist? [ Process.new(:scheduler, { recurring_tasks: recurring_tasks, **scheduler_options.with_defaults(SCHEDULER_DEFAULTS) }) ] else [] @@ -233,6 +233,10 @@ def dynamic_recurring_tasks_enabled? scheduler_options.fetch(:dynamic_tasks_enabled, SCHEDULER_DEFAULTS[:dynamic_tasks_enabled]) end + def static_recurring_tasks_exist? + RecurringTask.static.exists? + end + def recurring_tasks @recurring_tasks ||= recurring_tasks_config.map do |id, options| RecurringTask.from_configuration(id, **options.merge(static: true)) if options&.has_key?(:schedule) diff --git a/test/unit/scheduler_test.rb b/test/unit/scheduler_test.rb index e914a23c..2404023a 100644 --- a/test/unit/scheduler_test.rb +++ b/test/unit/scheduler_test.rb @@ -68,6 +68,29 @@ class SchedulerTest < ActiveSupport::TestCase scheduler.stop end + test "removes recurring tasks no longer present in the configuration" do + previous_scheduler = SolidQueue::Scheduler.new( + recurring_tasks: { removed_task: { class: "AddToBufferJob", schedule: "every hour" } } + ).tap(&:start) + + wait_for_registered_processes(1, timeout: 1.second) + wait_for { SolidQueue::RecurringTask.exists?(key: "removed_task") } + + previous_scheduler.stop + + configuration = SolidQueue::Configuration.new( + recurring_schedule_file: config_file_path(:empty_configuration), + scheduler: { dynamic_tasks_enabled: false } + ) + + scheduler = configuration.configured_processes.find { |process| process.kind == :scheduler }.instantiate.tap(&:start) + + wait_for_registered_processes(1, timeout: 1.second) + wait_for { !SolidQueue::RecurringTask.exists?(key: "removed_task") } + ensure + scheduler.stop + 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