In Sidekiq Enterprise, it supports periodic jobs (aka cron or recurring jobs) to register your periodic jobs with a schedule upon startup and Sidekiq will fire off corresponding jobs on that schedule.
However, we may misspell the class name at the register file and it would make Sidekiq not execute the periodic jobs. In this article, I’m going to share an example of a test to check your class name correctness at the Sidekiq register file.
Here is the example of the Sidekiq periodic jobs register file, and I misspelled the class name from SomeHourlyWorkerClass
to SomeHourlyWorkerClasss
# config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
config.periodic do |mgr|
mgr.register('0 * * * *', "SomeHourlyWorkerClasss") # misspelled
mgr.register('* * * * *', "SomeWorkerClass", retry: 2, queue: 'foo')
end
end
and I run bundle exec sidekiq
to start the sidekiq worker, it would show the errors and Sidekiq will not execute the periodic jobs.
❯ bundle exec sidekiq
2021-07-28T13:30:56.720Z 25890 TID-oway1dvum INFO: Booting Sidekiq 5.2.7 with redis options {:url=>nil, :id=>"Sidekiq-server-PID-25890"}
uninitialized constant SomeHourlyWorkerClasss
To avoid this situation, we move the jobs to a new file called lib/periodic_jobs.rb
to make the jobs testable.
# lib/periodic_jobs.rb
PERIODIC_JOBS = ->(mgr) {
mgr.register('0 * * * *', "SomeHourlyWorkerClasss") # misspelled
mgr.register('* * * * *', "SomeWorkerClass", retry: 2, queue: 'foo')
}
and require the periodic_jobs.rb
at sidekiq config file.
Sidekiq.configure_server do |config|
require 'periodic_jobs'
# file is in lib/periodic_jobs.rb
config.periodic(&PERIODIC_JOBS)
end
We also need to create a test to check class name correctness, at spec/lib/periodic_jobs_spec.rb
# spec/lib/periodic_jobs_spec.rb
class Verifier
def register(_sched, name, *_rest)
name.constantize if name.is_a?(String)
end
end
describe "PERIODIC_JOBS" do
it "verify workers' clasname are valid" do
require "periodic_jobs"
PERIODIC_JOBS.call(Verifier.new)
end
end
run the test with command rspec spec/lib/periodic_jobs_spec.rb
Randomized with seed 2330
F
Failures:
1) PERIODIC_JOBS verify workers' clasname are valid
Failure/Error: mgr.register('0 * * * *', "SomeHourlyWorkerClasss")
NameError:
uninitialized constant SomeHourlyWorkerClasss
# ./lib/periodic_jobs.rb:16:in `block in <top (required)>'
# ./spec/lib/periodic_jobs_spec.rb:10:in `block (2 levels) in <top (required)>'
# ./spec/spec_helper.rb:115:in `block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:114:in `block (2 levels) in <top (required)>'
# ./spec/spec_helper.rb:109:in `block (2 levels) in <top (required)>'
# ./spec/spec_helper.rb:101:in `block (2 levels) in <top (required)>'
# ------------------
# --- Caused by: ---
# NameError:
# uninitialized constant SomeHourlyWorkerClasss
# ./lib/periodic_jobs.rb:16:in `block in <top (required)>'
Top 1 slowest examples (0.04514 seconds, 5.2% of total time):
PERIODIC_JOBS verify workers' clasname are valid
0.04514 seconds ./spec/lib/periodic_jobs_spec.rb:8
Finished in 0.86432 seconds (files took 2 minutes 1.2 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/lib/periodic_jobs_spec.rb:8 # PERIODIC_JOBS verify workers' clasname are valid
Randomized with seed 2330
The spec will be pointed out which class name is an error, you can also integrate this test to your CI/CD to prevent class name misspelled.
The post A test to avoid class name misspelled in Sidekiq Periodic Jobs appeared first on CoinGecko Blog.