Skip to content

Commit

Permalink
Support new persisted recurring tasks in Solid Queue
Browse files Browse the repository at this point in the history
  • Loading branch information
rosa committed Aug 6, 2024
1 parent 56ddbe1 commit 14e176a
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 31 deletions.
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ git_source(:bc) { |repo| "https://github.com/basecamp/#{repo}" }
# Specify your gem's dependencies in mission_control-jobs.gemspec.
gemspec

gem "solid_queue", github: "rails/solid_queue", branch: "persist-recurring-tasks"

gem "capybara", github: "teamcapybara/capybara"
26 changes: 16 additions & 10 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
GIT
remote: https://github.com/rails/solid_queue.git
revision: 953349c09e65569918f52ed07f665253345ec562
branch: persist-recurring-tasks
specs:
solid_queue (0.4.1)
activejob (>= 7.1)
activerecord (>= 7.1)
concurrent-ruby (>= 1.3.1)
fugit (~> 1.11.0)
railties (>= 7.1)

GIT
remote: https://github.com/teamcapybara/capybara.git
revision: c0cbf4024c1abd48b0c22c2930e7b05af58ab284
Expand Down Expand Up @@ -105,7 +117,7 @@ GEM
base64 (0.2.0)
bigdecimal (3.1.7)
builder (3.2.4)
concurrent-ruby (1.2.3)
concurrent-ruby (1.3.3)
connection_pool (2.4.1)
crass (1.0.6)
date (3.3.4)
Expand All @@ -116,8 +128,8 @@ GEM
erubi (1.12.0)
et-orbi (1.2.11)
tzinfo
fugit (1.9.0)
et-orbi (~> 1, >= 1.2.7)
fugit (1.11.0)
et-orbi (~> 1, >= 1.2.11)
raabro (~> 1.4)
globalid (1.2.1)
activesupport (>= 6.1)
Expand Down Expand Up @@ -288,12 +300,6 @@ GEM
rack-protection (= 4.0.0)
rack-session (>= 2.0.0, < 3)
tilt (~> 2.0)
solid_queue (0.3.0)
activejob (>= 7.1)
activerecord (>= 7.1)
concurrent-ruby (~> 1.2.2)
fugit (~> 1.9.0)
railties (>= 7.1)
sprockets (4.2.1)
concurrent-ruby (~> 1.0)
rack (>= 2.2.4, < 4)
Expand Down Expand Up @@ -351,7 +357,7 @@ DEPENDENCIES
rubocop-performance
rubocop-rails-omakase
selenium-webdriver
solid_queue
solid_queue!
sprockets-rails
sqlite3

Expand Down
33 changes: 13 additions & 20 deletions lib/active_job/queue_adapters/solid_queue_ext/recurring_tasks.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,29 @@ def supports_recurring_tasks?
end

def recurring_tasks
tasks = recurring_tasks_from_dispatchers
last_enqueued_at_times = recurring_task_last_enqueued_at(tasks.keys)
tasks = SolidQueue::RecurringTask.all
last_enqueued_at_times = recurring_task_last_enqueued_at(tasks.map(&:key))

recurring_tasks_from_dispatchers.collect do |task_id, task_attrs|
recurring_task_attributes_from_solid_queue_task_attributes(task_attrs).merge \
id: task_id,
last_enqueued_at: last_enqueued_at_times[task_id]
tasks.collect do |task|
recurring_task_attributes_from_solid_queue_recurring_task(task).merge \
last_enqueued_at: last_enqueued_at_times[task.key]
end
end

def find_recurring_task(task_id)
if task_attrs = recurring_tasks_from_dispatchers[task_id]
recurring_task_attributes_from_solid_queue_task_attributes(task_attrs).merge \
id: task_id,
last_enqueued_at: recurring_task_last_enqueued_at(task_id).values&.first
if task = SolidQueue::RecurringTask.find_by(key: task_id)
recurring_task_attributes_from_solid_queue_recurring_task(task).merge \
last_enqueued_at: recurring_task_last_enqueued_at(task.key).values&.first
end
end

private
def recurring_tasks_from_dispatchers
SolidQueue::Process.where(kind: "Dispatcher").flat_map do |process|
process.metadata["recurring_schedule"]
end.compact.reduce({}, &:merge)
end

def recurring_task_attributes_from_solid_queue_task_attributes(task_attributes)
def recurring_task_attributes_from_solid_queue_recurring_task(task)
{
job_class_name: task_attributes["class_name"],
arguments: task_attributes["arguments"],
schedule: task_attributes["schedule"]
id: task.key,
job_class_name: task.class_name,
arguments: task.arguments,
schedule: task.schedule
}
end

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# This migration comes from solid_queue (originally 20240719134516)
class CreateRecurringTasks < ActiveRecord::Migration[7.1]
def change
create_table :solid_queue_recurring_tasks do |t|
t.string :key, null: false, index: { unique: true }
t.string :schedule, null: false
t.string :command, limit: 2048
t.string :class_name
t.text :arguments

t.string :queue_name
t.integer :priority, default: 0

t.boolean :static, default: true, index: true

t.text :description

t.timestamps
end
end
end
18 changes: 17 additions & 1 deletion test/dummy/db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

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

create_table "solid_queue_recurring_tasks", force: :cascade do |t|
t.string "key", null: false
t.string "schedule", null: false
t.string "command", limit: 2048
t.string "class_name"
t.text "arguments"
t.string "queue_name"
t.integer "priority", default: 0
t.boolean "static", default: true
t.text "description"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true
t.index ["static"], name: "index_solid_queue_recurring_tasks_on_static"
end

create_table "solid_queue_scheduled_executions", force: :cascade do |t|
t.integer "job_id", null: false
t.string "queue_name", null: false
Expand Down

0 comments on commit 14e176a

Please sign in to comment.