Skip to content

Commit 14e176a

Browse files
committed
Support new persisted recurring tasks in Solid Queue
See rails/solid_queue#272
1 parent 56ddbe1 commit 14e176a

File tree

5 files changed

+69
-31
lines changed

5 files changed

+69
-31
lines changed

Gemfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ git_source(:bc) { |repo| "https://github.com/basecamp/#{repo}" }
55
# Specify your gem's dependencies in mission_control-jobs.gemspec.
66
gemspec
77

8+
gem "solid_queue", github: "rails/solid_queue", branch: "persist-recurring-tasks"
9+
810
gem "capybara", github: "teamcapybara/capybara"

Gemfile.lock

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
GIT
2+
remote: https://github.com/rails/solid_queue.git
3+
revision: 953349c09e65569918f52ed07f665253345ec562
4+
branch: persist-recurring-tasks
5+
specs:
6+
solid_queue (0.4.1)
7+
activejob (>= 7.1)
8+
activerecord (>= 7.1)
9+
concurrent-ruby (>= 1.3.1)
10+
fugit (~> 1.11.0)
11+
railties (>= 7.1)
12+
113
GIT
214
remote: https://github.com/teamcapybara/capybara.git
315
revision: c0cbf4024c1abd48b0c22c2930e7b05af58ab284
@@ -105,7 +117,7 @@ GEM
105117
base64 (0.2.0)
106118
bigdecimal (3.1.7)
107119
builder (3.2.4)
108-
concurrent-ruby (1.2.3)
120+
concurrent-ruby (1.3.3)
109121
connection_pool (2.4.1)
110122
crass (1.0.6)
111123
date (3.3.4)
@@ -116,8 +128,8 @@ GEM
116128
erubi (1.12.0)
117129
et-orbi (1.2.11)
118130
tzinfo
119-
fugit (1.9.0)
120-
et-orbi (~> 1, >= 1.2.7)
131+
fugit (1.11.0)
132+
et-orbi (~> 1, >= 1.2.11)
121133
raabro (~> 1.4)
122134
globalid (1.2.1)
123135
activesupport (>= 6.1)
@@ -288,12 +300,6 @@ GEM
288300
rack-protection (= 4.0.0)
289301
rack-session (>= 2.0.0, < 3)
290302
tilt (~> 2.0)
291-
solid_queue (0.3.0)
292-
activejob (>= 7.1)
293-
activerecord (>= 7.1)
294-
concurrent-ruby (~> 1.2.2)
295-
fugit (~> 1.9.0)
296-
railties (>= 7.1)
297303
sprockets (4.2.1)
298304
concurrent-ruby (~> 1.0)
299305
rack (>= 2.2.4, < 4)
@@ -351,7 +357,7 @@ DEPENDENCIES
351357
rubocop-performance
352358
rubocop-rails-omakase
353359
selenium-webdriver
354-
solid_queue
360+
solid_queue!
355361
sprockets-rails
356362
sqlite3
357363

lib/active_job/queue_adapters/solid_queue_ext/recurring_tasks.rb

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,29 @@ def supports_recurring_tasks?
44
end
55

66
def recurring_tasks
7-
tasks = recurring_tasks_from_dispatchers
8-
last_enqueued_at_times = recurring_task_last_enqueued_at(tasks.keys)
7+
tasks = SolidQueue::RecurringTask.all
8+
last_enqueued_at_times = recurring_task_last_enqueued_at(tasks.map(&:key))
99

10-
recurring_tasks_from_dispatchers.collect do |task_id, task_attrs|
11-
recurring_task_attributes_from_solid_queue_task_attributes(task_attrs).merge \
12-
id: task_id,
13-
last_enqueued_at: last_enqueued_at_times[task_id]
10+
tasks.collect do |task|
11+
recurring_task_attributes_from_solid_queue_recurring_task(task).merge \
12+
last_enqueued_at: last_enqueued_at_times[task.key]
1413
end
1514
end
1615

1716
def find_recurring_task(task_id)
18-
if task_attrs = recurring_tasks_from_dispatchers[task_id]
19-
recurring_task_attributes_from_solid_queue_task_attributes(task_attrs).merge \
20-
id: task_id,
21-
last_enqueued_at: recurring_task_last_enqueued_at(task_id).values&.first
17+
if task = SolidQueue::RecurringTask.find_by(key: task_id)
18+
recurring_task_attributes_from_solid_queue_recurring_task(task).merge \
19+
last_enqueued_at: recurring_task_last_enqueued_at(task.key).values&.first
2220
end
2321
end
2422

2523
private
26-
def recurring_tasks_from_dispatchers
27-
SolidQueue::Process.where(kind: "Dispatcher").flat_map do |process|
28-
process.metadata["recurring_schedule"]
29-
end.compact.reduce({}, &:merge)
30-
end
31-
32-
def recurring_task_attributes_from_solid_queue_task_attributes(task_attributes)
24+
def recurring_task_attributes_from_solid_queue_recurring_task(task)
3325
{
34-
job_class_name: task_attributes["class_name"],
35-
arguments: task_attributes["arguments"],
36-
schedule: task_attributes["schedule"]
26+
id: task.key,
27+
job_class_name: task.class_name,
28+
arguments: task.arguments,
29+
schedule: task.schedule
3730
}
3831
end
3932

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# This migration comes from solid_queue (originally 20240719134516)
2+
class CreateRecurringTasks < ActiveRecord::Migration[7.1]
3+
def change
4+
create_table :solid_queue_recurring_tasks do |t|
5+
t.string :key, null: false, index: { unique: true }
6+
t.string :schedule, null: false
7+
t.string :command, limit: 2048
8+
t.string :class_name
9+
t.text :arguments
10+
11+
t.string :queue_name
12+
t.integer :priority, default: 0
13+
14+
t.boolean :static, default: true, index: true
15+
16+
t.text :description
17+
18+
t.timestamps
19+
end
20+
end
21+
end

test/dummy/db/schema.rb

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema[7.1].define(version: 2023_09_14_113326) do
13+
ActiveRecord::Schema[7.1].define(version: 2024_08_06_160416) do
1414
create_table "posts", force: :cascade do |t|
1515
t.string "title"
1616
t.text "body"
@@ -100,6 +100,22 @@
100100
t.index ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true
101101
end
102102

103+
create_table "solid_queue_recurring_tasks", force: :cascade do |t|
104+
t.string "key", null: false
105+
t.string "schedule", null: false
106+
t.string "command", limit: 2048
107+
t.string "class_name"
108+
t.text "arguments"
109+
t.string "queue_name"
110+
t.integer "priority", default: 0
111+
t.boolean "static", default: true
112+
t.text "description"
113+
t.datetime "created_at", null: false
114+
t.datetime "updated_at", null: false
115+
t.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true
116+
t.index ["static"], name: "index_solid_queue_recurring_tasks_on_static"
117+
end
118+
103119
create_table "solid_queue_scheduled_executions", force: :cascade do |t|
104120
t.integer "job_id", null: false
105121
t.string "queue_name", null: false

0 commit comments

Comments
 (0)