Skip to content

Commit 2c3e067

Browse files
feat: allow using a pattern of file to specify multiple configurations of recurring tasks
1 parent 6dc5c66 commit 2c3e067

File tree

5 files changed

+37
-2
lines changed

5 files changed

+37
-2
lines changed

lib/solid_queue.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ module SolidQueue
4141
mattr_accessor :clear_finished_jobs_after, default: 1.day
4242
mattr_accessor :default_concurrency_control_period, default: 3.minutes
4343

44+
mattr_accessor :recurring_config_file_pattern, default: SolidQueue::Configuration::DEFAULT_RECURRING_SCHEDULE_FILE_PATH
45+
4446
delegate :on_start, :on_stop, :on_exit, to: Supervisor
4547

4648
[ Dispatcher, Scheduler, Worker ].each do |process|

lib/solid_queue/configuration.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,15 @@ def processes_config
154154

155155
def recurring_tasks_config
156156
@recurring_tasks_config ||= begin
157-
config_from options[:recurring_schedule_file]
157+
if options.key?(:recurring_schedule_config_pattern)
158+
matching_configurations = Dir.glob(Rails.root.join(options[:recurring_schedule_config_pattern]))
159+
matching_configurations
160+
.each_with_object({}) do |config_file, recurring_configuration|
161+
recurring_configuration.merge!(config_from config_file)
162+
end
163+
else
164+
config_from options[:recurring_schedule_file]
165+
end
158166
end
159167
end
160168

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
periodic_store_result_a:
2+
class: StoreResultJob
3+
queue: default
4+
args: [ 42, { status: "custom_status" } ]
5+
schedule: every second
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
periodic_store_result_b:
2+
class: StoreResultJob
3+
queue: default
4+
args: [ 42, { status: "custom_status" } ]
5+
schedule: every second

test/unit/configuration_test.rb

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class ConfigurationTest < ActiveSupport::TestCase
6868
assert_processes configuration, :scheduler, 1
6969

7070
scheduler = configuration.configured_processes.second.instantiate
71+
assert_equal 1, scheduler.recurring_schedule.configured_tasks.count
7172
assert_has_recurring_task scheduler, key: "periodic_store_result", class_name: "StoreResultJob", schedule: "every second"
7273
end
7374

@@ -77,6 +78,7 @@ class ConfigurationTest < ActiveSupport::TestCase
7778
assert_processes configuration, :scheduler, 1
7879

7980
scheduler = configuration.configured_processes.first.instantiate
81+
assert_equal 1, scheduler.recurring_schedule.configured_tasks.count
8082
assert_has_recurring_task scheduler, key: "periodic_store_result", class_name: "StoreResultJob", schedule: "every second"
8183
end
8284

@@ -143,6 +145,20 @@ class ConfigurationTest < ActiveSupport::TestCase
143145
configuration.errors.full_messages.first
144146
end
145147

148+
test 'multiple recurring configuration files' do
149+
configuration = SolidQueue::Configuration.new(recurring_schedule_config_pattern: 'config/recurring_matching_pattern_*.yml')
150+
151+
assert configuration.valid?
152+
assert_processes configuration, :scheduler, 1
153+
154+
scheduler = configuration.configured_processes.find { |process| process.kind == :scheduler }.instantiate
155+
156+
assert_equal 2, scheduler.recurring_schedule.configured_tasks.count
157+
assert_has_recurring_task scheduler, key: "periodic_store_result_a", class_name: "StoreResultJob", schedule: "every second"
158+
assert_has_recurring_task scheduler, key: "periodic_store_result_b", class_name: "StoreResultJob", schedule: "every second"
159+
ensure
160+
end
161+
146162
private
147163
def assert_processes(configuration, kind, count, **attributes)
148164
processes = configuration.configured_processes.select { |p| p.kind == kind }
@@ -159,7 +175,6 @@ def assert_processes(configuration, kind, count, **attributes)
159175
end
160176

161177
def assert_has_recurring_task(scheduler, key:, **attributes)
162-
assert_equal 1, scheduler.recurring_schedule.configured_tasks.count
163178
task = scheduler.recurring_schedule.configured_tasks.detect { |t| t.key == key }
164179

165180
attributes.each do |attr, value|

0 commit comments

Comments
 (0)