Skip to content

Commit 03334b1

Browse files
committed
Allow configuring queue and priority for recurring tasks
And also setting a description that we can use from Mission Control in the future.
1 parent 0aa1644 commit 03334b1

File tree

3 files changed

+64
-17
lines changed

3 files changed

+64
-17
lines changed

app/models/solid_queue/recurring_task.rb

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,15 @@ def wrap(args)
1717
end
1818

1919
def from_configuration(key, **options)
20-
new(key: key, class_name: options[:class], schedule: options[:schedule], arguments: options[:args])
20+
new \
21+
key: key,
22+
class_name: options[:class],
23+
arguments: options[:args],
24+
schedule: options[:schedule],
25+
queue_name: options[:queue_name].presence,
26+
priority: options[:priority].presence,
27+
description: options[:description],
28+
static: true
2129
end
2230

2331
def create_or_update_all(tasks)
@@ -89,7 +97,7 @@ def using_solid_queue_adapter?
8997

9098
def enqueue_and_record(run_at:)
9199
RecurringExecution.record(key, run_at) do
92-
job_class.new(*arguments_with_kwargs).tap do |active_job|
100+
job_class.new(*arguments_with_kwargs).set(enqueue_options).tap do |active_job|
93101
active_job.run_callbacks(:enqueue) do
94102
Job.enqueue(active_job)
95103
end
@@ -99,7 +107,7 @@ def enqueue_and_record(run_at:)
99107
end
100108

101109
def perform_later(&block)
102-
job_class.perform_later(*arguments_with_kwargs, &block)
110+
job_class.set(enqueue_options).perform_later(*arguments_with_kwargs, &block)
103111
end
104112

105113
def arguments_with_kwargs
@@ -118,5 +126,9 @@ def parsed_schedule
118126
def job_class
119127
@job_class ||= class_name&.safe_constantize
120128
end
129+
130+
def enqueue_options
131+
{ queue: queue_name, priority: priority }.compact
132+
end
121133
end
122134
end

test/models/solid_queue/recurring_task_test.rb

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ def perform(value, options = {}, **kwargs)
2525
end
2626
end
2727

28+
class JobWithPriority < ApplicationJob
29+
queue_with_priority 10
30+
31+
def perform
32+
JobBuffer.add "job_with_priority"
33+
end
34+
end
35+
2836
class JobUsingAsyncAdapter < ApplicationJob
2937
self.queue_adapter = :async
3038

@@ -33,11 +41,6 @@ def perform
3341
end
3442
end
3543

36-
setup do
37-
@worker = SolidQueue::Worker.new(queues: "*")
38-
@worker.mode = :inline
39-
end
40-
4144
test "job without arguments" do
4245
task = recurring_task_with(class_name: "JobWithoutArguments")
4346
enqueue_and_assert_performed_with_result task, "job_without_arguments"
@@ -126,20 +129,48 @@ def perform
126129
assert_not SolidQueue::RecurringTask.new(key: "task-id", schedule: "every minute").valid?
127130
end
128131

132+
test "task with custom queue and priority" do
133+
task = recurring_task_with(class_name: "JobWithoutArguments", queue_name: "my_new_queue", priority: 4)
134+
enqueue_and_assert_performed_with_result task, "job_without_arguments"
135+
136+
job = SolidQueue::Job.last
137+
assert_equal "my_new_queue", job.queue_name
138+
assert_equal 4, job.priority
139+
end
140+
141+
test "overriding existing priority" do
142+
task = recurring_task_with(class_name: "JobWithPriority", priority: nil).tap(&:save!)
143+
enqueue_and_assert_performed_with_result task.reload, "job_with_priority"
144+
145+
job = SolidQueue::Job.last
146+
assert_equal 10, job.priority
147+
148+
task.destroy
149+
150+
task = recurring_task_with(class_name: "JobWithPriority", priority: 4).tap(&:save!)
151+
enqueue_and_assert_performed_with_result task.reload, "job_with_priority"
152+
153+
job = SolidQueue::Job.last
154+
assert_equal 4, job.priority
155+
end
156+
129157
private
130158
def enqueue_and_assert_performed_with_result(task, result)
131159
assert_difference [ -> { SolidQueue::Job.count }, -> { SolidQueue::ReadyExecution.count } ], +1 do
132160
task.enqueue(at: Time.now)
133161
end
134162

135163
assert_difference -> { JobBuffer.size }, +1 do
136-
@worker.start
164+
SolidQueue::Worker.new(queues: "*").tap do |worker|
165+
worker.mode = :inline
166+
worker.start
167+
end
137168
end
138169

139170
assert_equal result, JobBuffer.last_value
140171
end
141172

142-
def recurring_task_with(class_name:, schedule: "every hour", args: nil)
143-
SolidQueue::RecurringTask.new(key: "task-id", class_name: "SolidQueue::RecurringTaskTest::#{class_name}", schedule: schedule, arguments: args)
173+
def recurring_task_with(class_name:, schedule: "every hour", args: nil, **options)
174+
SolidQueue::RecurringTask.new(key: "task-id", class_name: "SolidQueue::RecurringTaskTest::#{class_name}", schedule: schedule, arguments: args, **options)
144175
end
145176
end

test/unit/configuration_test.rb

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,7 @@ def assert_processes(configuration, kind, count, **attributes)
111111
value = value.first
112112
end
113113

114-
if expected_value.nil?
115-
assert_nil value
116-
else
117-
assert_equal expected_value, value
118-
end
114+
assert_equal_value expected_value, value
119115
end
120116
end
121117

@@ -124,7 +120,15 @@ def assert_has_recurring_task(dispatcher, key:, **attributes)
124120
task = dispatcher.recurring_schedule.configured_tasks.detect { |t| t.key == key }
125121

126122
attributes.each do |attr, value|
127-
assert_equal value, task.public_send(attr)
123+
assert_equal_value value, task.public_send(attr)
124+
end
125+
end
126+
127+
def assert_equal_value(expected_value, value)
128+
if expected_value.nil?
129+
assert_nil value
130+
else
131+
assert_equal expected_value, value
128132
end
129133
end
130134

0 commit comments

Comments
 (0)