lib/good_job/engine.rb in good_job-3.27.0 vs lib/good_job/engine.rb in good_job-3.27.1

- old
+ new

@@ -47,25 +47,20 @@ end end end initializer "good_job.start_async" do - # This hooks into the hookable places during Rails boot, which is unfortunately not Rails.application.initialized? - # If an Adapter is initialized during boot, we want to want to start async executors once the framework dependencies have loaded. - # When exactly that happens is out of our control because gems or application code may touch things earlier than expected. - # For example, as of Rails 6.1, if an ActiveRecord model is touched during boot, that triggers ActiveRecord to load, - # which touches DestroyAssociationAsyncJob, which loads ActiveJob, which may initialize a GoodJob::Adapter, all of which - # happens _before_ ActiveRecord finishes loading. GoodJob will deadlock if an async executor is started in the middle of - # ActiveRecord loading. config.after_initialize do - ActiveSupport.on_load(:active_record) do - ActiveSupport.on_load(:active_job) do - GoodJob._framework_ready = true - GoodJob._start_async_adapters - end - GoodJob._start_async_adapters - end - GoodJob._start_async_adapters + GoodJob._async_ready = true + + # Ensure Active Record and Active Job are fully loaded + ActiveRecord::Base # rubocop:disable Lint/Void + ActiveJob::Base.queue_adapter + + GoodJob::Adapter.instances + .select(&:execute_async?) + .reject(&:async_started?) + .each(&:start_async) end end end end