diff --git a/lib/job-iteration/interruption_adapters.rb b/lib/job-iteration/interruption_adapters.rb index 1cd8f10b..71cef620 100644 --- a/lib/job-iteration/interruption_adapters.rb +++ b/lib/job-iteration/interruption_adapters.rb @@ -4,7 +4,7 @@ module JobIteration module InterruptionAdapters - BUNDLED_ADAPTERS = [:resque, :sidekiq].freeze # @api private + BUNDLED_ADAPTERS = [:good_job, :resque, :sidekiq].freeze # @api private class << self # Returns adapter for specified name. diff --git a/lib/job-iteration/interruption_adapters/good_job_adapter.rb b/lib/job-iteration/interruption_adapters/good_job_adapter.rb new file mode 100644 index 00000000..c4e0370f --- /dev/null +++ b/lib/job-iteration/interruption_adapters/good_job_adapter.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +begin + require "good_job" +rescue LoadError + # GoodJob is not available, no need to load the adapter + return +end + +begin + # GoodJob.current_thread_shutting_down? was introduced in GoodJob 3.26 + gem("good_job", ">= 3.26") +rescue Gem::LoadError + warn("job-iteration's interruption adapter for GoodJob requires GoodJob 3.26 or newer") + return +end + +module JobIteration + module InterruptionAdapters + module GoodJobAdapter + class << self + def call + !!::GoodJob.current_thread_shutting_down? + end + end + end + + register(:good_job, GoodJobAdapter) + end +end diff --git a/test/integration/interruption_adapters_test.rb b/test/integration/interruption_adapters_test.rb index 5445e79d..47a72335 100644 --- a/test/integration/interruption_adapters_test.rb +++ b/test/integration/interruption_adapters_test.rb @@ -36,7 +36,8 @@ class InterruptionAdaptersTest < ActiveSupport::TestCase ruby = <<~RUBY require 'bundler/setup' require 'job-iteration' - JobIteration::InterruptionAdapters::BUNDLED_ADAPTERS.each do |name| + # The adapter for GoodJob cannot be easily tested at the moment. + JobIteration::InterruptionAdapters::BUNDLED_ADAPTERS.excluding(:good_job).each do |name| JobIteration::InterruptionAdapters.lookup(name) end RUBY