Skip to content

Commit 3f03485

Browse files
committed
Merge remote-tracking branch 'branch/main' into safe-shutdown-producer
2 parents 751b255 + e2d10c0 commit 3f03485

9 files changed

Lines changed: 160 additions & 33 deletions

File tree

.github/workflows/main.yml

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,26 @@ jobs:
2424
- '2.6'
2525
- '2.7'
2626
- '3.0'
27+
- '3.1'
28+
- '3.2'
2729
gemfile:
28-
- gemfiles/activejob_4.2.x.gemfile
29-
- gemfiles/activejob_5.2.x.gemfile
3030
- gemfiles/activejob_6.0.x.gemfile
3131
- gemfiles/activejob_6.1.x.gemfile
3232
- gemfiles/activejob_7.0.x.gemfile
33+
- gemfiles/activejob_7.1.x.gemfile
3334
exclude:
34-
- ruby: '2.7'
35-
gemfile: gemfiles/activejob_4.2.x.gemfile
36-
- ruby: '3.0'
37-
gemfile: gemfiles/activejob_4.2.x.gemfile
38-
- ruby: '3.0'
39-
gemfile: gemfiles/activejob_5.2.x.gemfile
4035
- ruby: '2.5'
4136
gemfile: gemfiles/activejob_7.0.x.gemfile
4237
- ruby: '2.6'
4338
gemfile: gemfiles/activejob_7.0.x.gemfile
44-
39+
- ruby: '2.5'
40+
gemfile: gemfiles/activejob_7.1.x.gemfile
41+
- ruby: '2.6'
42+
gemfile: gemfiles/activejob_7.1.x.gemfile
43+
- ruby: '3.2'
44+
gemfile: gemfiles/activejob_6.0.x.gemfile
45+
- ruby: '3.2'
46+
gemfile: gemfiles/activejob_6.1.x.gemfile
4547
steps:
4648
- name: Checkout code
4749
uses: actions/checkout@v2

Appraisals

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
# frozen_string_literal: true
22

3-
appraise 'activejob-4.2.x' do
4-
gem 'rails', '~> 4.2.11'
5-
end
6-
7-
appraise 'activejob-5.2.x' do
8-
gem 'rails', '~> 5.2.4'
9-
end
10-
113
appraise 'activejob-6.0.x' do
124
gem 'rails', '~> 6.0.3'
5+
gem 'concurrent-ruby', '1.3.4'
136
end
147

158
appraise 'activejob-6.1.x' do
169
gem 'rails', '~> 6.1.0'
10+
gem 'concurrent-ruby', '1.3.4'
1711
end
1812

1913
appraise 'activejob-7.0.x' do
2014
gem 'rails', '~> 7.0.0'
15+
gem 'concurrent-ruby', '1.3.4'
16+
end
17+
18+
appraise 'activejob-7.1.x' do
19+
gem 'rails', '~> 7.1.0'
2120
end

advanced-sneakers-activejob.gemspec

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ Gem::Specification.new do |spec|
2727

2828
spec.require_paths = ['lib']
2929

30-
spec.add_dependency 'activejob', '>= 4.2'
30+
spec.add_dependency 'activejob', '>= 6.0'
3131
spec.add_dependency 'bunny-publisher', '~> 0.2.0'
32-
spec.add_dependency 'sneakers', '~> 2.7'
32+
spec.add_dependency 'kicks', '~> 3.0'
3333

34-
spec.add_development_dependency 'appraisal', '~> 2.3.0'
34+
spec.add_development_dependency 'appraisal', '~> 2.5.0'
3535
spec.add_development_dependency 'bundler'
3636
spec.add_development_dependency 'pry-byebug'
3737
spec.add_development_dependency 'rabbitmq_http_api_client', '~> 1.13'

gemfiles/activejob_6.0.x.gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
source "https://rubygems.org"
44

55
gem "rails", "~> 6.0.3"
6+
gem "concurrent-ruby", "1.3.4"
67

78
gemspec path: "../"

gemfiles/activejob_6.1.x.gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
source "https://rubygems.org"
44

55
gem "rails", "~> 6.1.0"
6+
gem "concurrent-ruby", "1.3.4"
67

78
gemspec path: "../"

gemfiles/activejob_7.0.x.gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
source "https://rubygems.org"
44

55
gem "rails", "~> 7.0.0"
6+
gem "concurrent-ruby", "1.3.4"
67

78
gemspec path: "../"

gemfiles/activejob_7.1.x.gemfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# This file was generated by Appraisal
2+
3+
source "https://rubygems.org"
4+
5+
gem "rails", "~> 7.1.0"
6+
7+
gemspec path: "../"

lib/advanced_sneakers_activejob/workers_registry.rb

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,41 @@ def define_active_job_consumers
7070
active_job_classes_with_matching_adapter.each do |worker|
7171
AdvancedSneakersActiveJob.define_consumer(queue_name: worker.new.queue_name)
7272
end
73+
74+
action_mailer_classes_with_matching_adapter.each do |mailer|
75+
AdvancedSneakersActiveJob.define_consumer(queue_name: mailer_queue_name(mailer))
76+
end
7377
end
7478

7579
private
7680

7781
def active_job_classes_with_matching_adapter
7882
([ActiveJob::Base] + ActiveJob::Base.descendants).select do |klass|
79-
klass.queue_adapter == ::ActiveJob::QueueAdapters::AdvancedSneakersAdapter ||
80-
klass.queue_adapter.is_a?(::ActiveJob::QueueAdapters::AdvancedSneakersAdapter)
83+
advanced_sneakers_adapter?(klass) &&
84+
!(defined?(ActionMailer::Base) && klass == ActionMailer::MailDeliveryJob)
85+
end
86+
end
87+
88+
def action_mailer_classes_with_matching_adapter
89+
return [] if !defined?(ActionMailer::Base) ||
90+
ActionMailer.gem_version < Gem::Version.new('6.0.0') ||
91+
!advanced_sneakers_adapter?(ActionMailer::MailDeliveryJob)
92+
93+
([ActionMailer::Base] + ActionMailer::Base.descendants).select do |klass|
94+
klass.delivery_job == ActionMailer::MailDeliveryJob
8195
end
8296
end
97+
98+
def advanced_sneakers_adapter?(klass)
99+
klass.queue_adapter == ::ActiveJob::QueueAdapters::AdvancedSneakersAdapter ||
100+
klass.queue_adapter.is_a?(::ActiveJob::QueueAdapters::AdvancedSneakersAdapter)
101+
end
102+
103+
# Gets the queue name for the mailer with activejob prefix and delimiter
104+
# Queue name from ActionMailer::Base.deliver_later_queue_name is not prefixed
105+
# and has no delimiter, so we need to add them manually
106+
def mailer_queue_name(mailer)
107+
[ActiveJob::Base.queue_name_prefix, mailer.deliver_later_queue_name.to_s].compact.join(ActiveJob::Base.queue_name_delimiter)
108+
end
83109
end
84110
end

spec/integration/consumers_spec.rb

Lines changed: 101 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,90 @@ class DynamicQueueJob < ApplicationJob
7878
end
7979
end
8080

81-
if ActiveJob.gem_version >= Gem::Version.new('5.0')
82-
context 'when there are ActiveJob classes with custom queue adapter' do
81+
context 'when there are ActiveJob classes with custom queue adapter' do
82+
subject do
83+
in_app_process(adapter: :advanced_sneakers) do
84+
class FooJob < ApplicationJob
85+
self.queue_adapter = :async
86+
87+
queue_as :bar
88+
end
89+
90+
AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only }
91+
92+
Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h
93+
end
94+
end
95+
96+
it 'are defined for queue from matching adapter only' do
97+
expected_consumers = {
98+
'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer
99+
'AdvancedSneakersActiveJob::MailersConsumer' => 'mailers', # action mailer consumer
100+
'AdvancedSneakersActiveJob::CustomConsumer' => 'custom' # see CustomQueueJob in spec/apps/app/jobs
101+
}
102+
103+
expect(subject.first).to eq(expected_consumers)
104+
end
105+
end
106+
107+
context 'when advanced_sneakers is set as custom adapter' do
108+
subject do
109+
in_app_process(adapter: :inline) do
110+
class FooJob < ApplicationJob
111+
self.queue_adapter = :advanced_sneakers
112+
113+
queue_as :bar
114+
end
115+
116+
AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only }
117+
118+
Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h
119+
end
120+
end
121+
122+
it 'are defined for queue from matching adapter only' do
123+
expected_consumers = {
124+
'AdvancedSneakersActiveJob::BarConsumer' => 'bar' # bar queue consumer for FooJob
125+
}
126+
127+
expect(subject.first).to eq(expected_consumers)
128+
end
129+
end
130+
131+
context 'when ActionMailer::Base has deliver_later_queue_name globally defined' do
132+
subject do
133+
in_app_process(adapter: :advanced_sneakers) do
134+
ActionMailer::Base.deliver_later_queue_name = 'bar'
135+
136+
AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only }
137+
138+
Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h
139+
end
140+
end
141+
142+
it 'are defined for queue from matching adapter only' do
143+
expected_consumers = {
144+
'AdvancedSneakersActiveJob::BarConsumer' => 'bar', # bar queue consumer for FooMailer
145+
'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer
146+
'AdvancedSneakersActiveJob::CustomConsumer' => 'custom', # see CustomQueueJob in spec/apps/app/jobs
147+
}
148+
149+
expect(subject.first).to eq(expected_consumers)
150+
end
151+
end
152+
153+
# Support for mailer specific queue name was added in Rails 7.1
154+
# https://github.com/rails/rails/pull/47408
155+
if ActiveJob.gem_version >= Gem::Version.new('7.1')
156+
context 'when there are ActionMailer classes with queue defined' do
83157
subject do
84158
in_app_process(adapter: :advanced_sneakers) do
85-
class FooJob < ApplicationJob
86-
self.queue_adapter = :async
159+
class FooMailer < ActionMailer::Base
160+
self.deliver_later_queue_name = 'bar'
161+
end
87162

88-
queue_as :bar
163+
class BarMailer < ActionMailer::Base
164+
self.deliver_later_queue_name = 'baz'
89165
end
90166

91167
AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only }
@@ -96,24 +172,35 @@ class FooJob < ApplicationJob
96172

97173
it 'are defined for queue from matching adapter only' do
98174
expected_consumers = {
175+
'AdvancedSneakersActiveJob::BarConsumer' => 'bar', # bar queue consumer for FooMailer
176+
'AdvancedSneakersActiveJob::BazConsumer' => 'baz', # baz queue consumer for BarMailer
99177
'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer
100178
'AdvancedSneakersActiveJob::MailersConsumer' => 'mailers', # action mailer consumer
101-
'AdvancedSneakersActiveJob::CustomConsumer' => 'custom' # see CustomQueueJob in spec/apps/app/jobs
179+
'AdvancedSneakersActiveJob::CustomConsumer' => 'custom', # see CustomQueueJob in spec/apps/app/jobs
102180
}
103181

104182
expect(subject.first).to eq(expected_consumers)
105183
end
106184
end
107185

108-
context 'when advanced_sneakers is set as custom adapter' do
186+
context 'when there are ActionMailer classes with custom delivery jobs' do
109187
subject do
110-
in_app_process(adapter: :inline) do
111-
class FooJob < ApplicationJob
112-
self.queue_adapter = :advanced_sneakers
188+
in_app_process(adapter: :advanced_sneakers) do
189+
class CustomDeliveryJob < ActionMailer::MailDeliveryJob
190+
self.queue_adapter = :async
113191

114192
queue_as :bar
115193
end
116194

195+
class FooMailer < ActionMailer::Base
196+
self.delivery_job = CustomDeliveryJob
197+
self.deliver_later_queue_name = 'bar'
198+
end
199+
200+
class BarMailer < ActionMailer::Base
201+
self.deliver_later_queue_name = 'baz'
202+
end
203+
117204
AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only }
118205

119206
Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h
@@ -122,7 +209,10 @@ class FooJob < ApplicationJob
122209

123210
it 'are defined for queue from matching adapter only' do
124211
expected_consumers = {
125-
'AdvancedSneakersActiveJob::BarConsumer' => 'bar' # bar queue consumer for FooJob
212+
'AdvancedSneakersActiveJob::BazConsumer' => 'baz', # baz queue consumer for BarMailer
213+
'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer
214+
'AdvancedSneakersActiveJob::MailersConsumer' => 'mailers', # action mailer consumer
215+
'AdvancedSneakersActiveJob::CustomConsumer' => 'custom', # see CustomQueueJob in spec/apps/app/jobs
126216
}
127217

128218
expect(subject.first).to eq(expected_consumers)

0 commit comments

Comments
 (0)