Skip to content

Commit 7e2b5d1

Browse files
committed
Convert recurring tasks into Active Records
So we can persist them in the DB and support dynamic tasks, more complex serialized arguments and enqueuing them on-demand from Mission Control more easily.
1 parent addd870 commit 7e2b5d1

File tree

7 files changed

+32
-17
lines changed

7 files changed

+32
-17
lines changed

lib/solid_queue/dispatcher/recurring_task.rb renamed to app/models/solid_queue/recurring_task.rb

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,19 @@
11
require "fugit"
22

33
module SolidQueue
4-
class Dispatcher::RecurringTask
4+
class RecurringTask < Record
5+
serialize :arguments, coder: JSON
6+
57
class << self
68
def wrap(args)
79
args.is_a?(self) ? args : from_configuration(args.first, **args.second)
810
end
911

1012
def from_configuration(key, **options)
11-
new(key, class_name: options[:class], schedule: options[:schedule], arguments: options[:args])
13+
new(key: key, class_name: options[:class], schedule: options[:schedule], arguments: options[:args] || [])
1214
end
1315
end
1416

15-
attr_reader :key, :schedule, :class_name, :arguments
16-
17-
def initialize(key, class_name:, schedule:, arguments: nil)
18-
@key = key
19-
@class_name = class_name
20-
@schedule = schedule
21-
@arguments = Array(arguments)
22-
end
23-
2417
def delay_from_now
2518
[ (next_time - Time.current).to_f, 0 ].max
2619
end
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class CreateRecurringTasks < ActiveRecord::Migration[7.1]
2+
def change
3+
create_table :solid_queue_recurring_tasks do |t|
4+
t.string :key, null: false, index: { unique: true }
5+
t.string :schedule, null: false
6+
t.string :class_name, null: false
7+
t.text :arguments
8+
9+
t.timestamps
10+
end
11+
end
12+
end

lib/solid_queue/configuration.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def options_from_raw_config(key, defaults)
7575

7676
def parse_recurring_tasks(tasks)
7777
Array(tasks).map do |id, options|
78-
Dispatcher::RecurringTask.from_configuration(id, **options)
78+
RecurringTask.from_configuration(id, **options)
7979
end.select(&:valid?)
8080
end
8181

lib/solid_queue/dispatcher/recurring_schedule.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class Dispatcher::RecurringSchedule
77
attr_reader :configured_tasks, :scheduled_tasks
88

99
def initialize(tasks)
10-
@configured_tasks = Array(tasks).map { |task| Dispatcher::RecurringTask.wrap(task) }
10+
@configured_tasks = Array(tasks).map { |task| SolidQueue::RecurringTask.wrap(task) }
1111
@scheduled_tasks = Concurrent::Hash.new
1212
end
1313

test/dummy/db/schema.rb

Lines changed: 11 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: 2024_02_18_110712) do
13+
ActiveRecord::Schema[7.1].define(version: 2024_07_19_134516) do
1414
create_table "job_results", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
1515
t.string "queue_name"
1616
t.string "status"
@@ -101,6 +101,16 @@
101101
t.index ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true
102102
end
103103

104+
create_table "solid_queue_recurring_tasks", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
105+
t.string "key", null: false
106+
t.string "schedule", null: false
107+
t.string "class_name", null: false
108+
t.text "arguments"
109+
t.datetime "created_at", null: false
110+
t.datetime "updated_at", null: false
111+
t.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true
112+
end
113+
104114
create_table "solid_queue_scheduled_executions", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
105115
t.bigint "job_id", null: false
106116
t.string "queue_name", null: false

test/integration/instrumentation_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ class InstrumentationTest < ActiveSupport::TestCase
289289
assert events.size >= 1
290290
event = events.last
291291

292-
assert_event event, "enqueue_recurring_task", task: :example_task, active_job_id: SolidQueue::Job.last.active_job_id
292+
assert_event event, "enqueue_recurring_task", task: "example_task", active_job_id: SolidQueue::Job.last.active_job_id
293293
assert event.last[:at].present?
294294
assert_nil event.last[:other_adapter]
295295
end

test/unit/recurring_task_test.rb renamed to test/models/solid_queue/recurring_task_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
require "test_helper"
22

3-
class RecurringTaskTest < ActiveSupport::TestCase
3+
class SolidQueue::RecurringTaskTest < ActiveSupport::TestCase
44
class JobWithoutArguments < ApplicationJob
55
def perform
66
JobBuffer.add "job_without_arguments"
@@ -130,6 +130,6 @@ def enqueue_and_assert_performed_with_result(task, result)
130130
end
131131

132132
def recurring_task_with(class_name:, schedule: "every hour", args: nil)
133-
SolidQueue::Dispatcher::RecurringTask.from_configuration("task-id", class: "RecurringTaskTest::#{class_name}", schedule: schedule, args: args)
133+
SolidQueue::RecurringTask.from_configuration("task-id", class: "SolidQueue::RecurringTaskTest::#{class_name}", schedule: schedule, args: args)
134134
end
135135
end

0 commit comments

Comments
 (0)