Created
March 7, 2024 11:34
-
-
Save marckohlbrugge/f7db398c6ecdf4c78ed90ed65142baca to your computer and use it in GitHub Desktop.
Simple script to move scheduled Sidekiq jobs to Active Job. Not properly tested yet. Use at your own risk!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require "sidekiq/api" | |
# Fetch scheduled Sidekiq jobs for migration to GoodJob | |
def fetch_sidekiq_jobs_for_goodjob_migration | |
raise "Remove this line if you understand this code is not properly tested and you assume the risk of losing data" | |
puts "Starting to fetch scheduled Sidekiq jobs for migration..." | |
scheduled_set = Sidekiq::ScheduledSet.new | |
jobs = scheduled_set.map do |job| | |
{ | |
"class" => job.klass.constantize, # Ensure this is an ActiveJob class | |
"args" => job.args, | |
"run_at" => Time.at(job.at), # The time the job is scheduled to run | |
"jid" => job.jid | |
} | |
end | |
puts "Fetched #{jobs.count} jobs from Sidekiq scheduled set." | |
jobs | |
end | |
# Migrate jobs to GoodJob and delete them from Sidekiq | |
def migrate_jobs_to_goodjob(jobs) | |
puts "Starting migration of #{jobs.count} jobs to GoodJob..." | |
jobs.each do |job| | |
next unless job["args"].first["job_class"].constantize <= ActionMailer::MailDeliveryJob | |
# Schedule the job with GoodJob | |
job_args = job["args"].first["arguments"] | |
mailer_class = job_args.first.constantize | |
mailer_method = job_args.second | |
args = job_args[3]["args"].collect { GlobalID::Locator.locate(_1.values.first) } | |
wait_until = job["run_at"] | |
puts "#{mailer_class}##{mailer_method}(*#{args}) scheduled for #{wait_until}" | |
mailer_class.public_send(mailer_method, *args).deliver_later(wait_until: wait_until) | |
# Find the job in the Sidekiq scheduled set and delete it | |
scheduled_set = Sidekiq::ScheduledSet.new | |
sidekiq_job = scheduled_set.find_job(job["jid"]) | |
if sidekiq_job | |
sidekiq_job.delete | |
puts "Deleted job #{job["jid"]} from Sidekiq scheduled set." | |
end | |
puts "Successfully migrated and deleted job: #{job["jid"]}" | |
rescue => e | |
# Handle the exception, possibly logging or notifying | |
puts "An error occurred while migrating job #{job["jid"]}: #{e.message}" | |
end | |
puts "Migration process completed." | |
end | |
# Example usage | |
jobs_to_migrate = fetch_sidekiq_jobs_for_goodjob_migration | |
migrate_jobs_to_goodjob(jobs_to_migrate) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment