diff --git a/app/models/solid_queue/recurring_task.rb b/app/models/solid_queue/recurring_task.rb index 40a5531e3..776db7561 100644 --- a/app/models/solid_queue/recurring_task.rb +++ b/app/models/solid_queue/recurring_task.rb @@ -142,7 +142,7 @@ def ensure_existing_job_class end def using_solid_queue_adapter? - job_class.queue_adapter_name.inquiry.solid_queue? + job_class.queue_adapter.is_a?(ActiveJob::QueueAdapters::SolidQueueAdapter) end def enqueue_and_record(run_at:) diff --git a/lib/active_job/batch_id.rb b/lib/active_job/batch_id.rb index 5ab621513..05be6ec3e 100644 --- a/lib/active_job/batch_id.rb +++ b/lib/active_job/batch_id.rb @@ -51,7 +51,7 @@ def batch private def solid_queue_job? - self.class.queue_adapter_name == "solid_queue" + self.class.queue_adapter.is_a?(ActiveJob::QueueAdapters::SolidQueueAdapter) end end end diff --git a/test/models/solid_queue/batch_test.rb b/test/models/solid_queue/batch_test.rb index 8dab723d7..a2e936f29 100644 --- a/test/models/solid_queue/batch_test.rb +++ b/test/models/solid_queue/batch_test.rb @@ -147,6 +147,14 @@ class OtherAdapterCallbackJob < ApplicationJob def perform; end end + class SubclassedSolidQueueAdapter < ActiveJob::QueueAdapters::SolidQueueAdapter; end + + class SubclassedAdapterJob < ApplicationJob + self.queue_adapter = SubclassedSolidQueueAdapter.new + + def perform; end + end + class HookedCallbackJob < ApplicationJob cattr_accessor :enqueue_hook_ran, default: false @@ -181,6 +189,13 @@ def perform; end assert_equal 0, SolidQueue::Job.where(class_name: AbortingCallbackJob.name).count end + test "jobs using a subclass of the Solid Queue adapter belong to the batch" do + batch = SolidQueue::Batch.enqueue { SubclassedAdapterJob.perform_later } + + assert_equal 1, batch.jobs.count + assert_equal batch.id, SolidQueue::Job.where(class_name: SubclassedAdapterJob.name).sole.batch_id + end + test "callback jobs enqueue through solid_queue regardless of their class adapter" do batch = SolidQueue::Batch.enqueue(on_finish: OtherAdapterCallbackJob) do NiceJob.perform_later("world") diff --git a/test/models/solid_queue/recurring_task_test.rb b/test/models/solid_queue/recurring_task_test.rb index 518fc7ed8..23ea3f879 100644 --- a/test/models/solid_queue/recurring_task_test.rb +++ b/test/models/solid_queue/recurring_task_test.rb @@ -41,6 +41,16 @@ def perform end end + class SubclassedSolidQueueAdapter < ActiveJob::QueueAdapters::SolidQueueAdapter; end + + class JobUsingSubclassedSolidQueueAdapter < ApplicationJob + self.queue_adapter = SubclassedSolidQueueAdapter.new + + def perform + JobBuffer.add "job_using_subclassed_solid_queue_adapter" + end + end + class JobWithConcurrencyControlsAndDiscard < ApplicationJob limits_concurrency key: -> { true }, on_conflict: :discard @@ -87,6 +97,14 @@ def perform assert_equal "job_using_async_adapter", JobBuffer.last_value end + test "job using a subclass of the Solid Queue adapter" do + task = recurring_task_with(class_name: "JobUsingSubclassedSolidQueueAdapter") + + assert_difference -> { SolidQueue::RecurringExecution.count }, +1 do + enqueue_and_assert_performed_with_result task, "job_using_subclassed_solid_queue_adapter" + end + end + test "error when enqueuing job before recording task" do SolidQueue::Job.stubs(:create!).raises(ActiveRecord::Deadlocked)