freddy 2.9.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +1 -1
- data/.ruby-version +1 -1
- data/Gemfile.lock +6 -6
- data/freddy.gemspec +1 -1
- data/lib/freddy/consumers/respond_to_consumer.rb +13 -2
- data/lib/freddy/consumers/tap_into_consumer.rb +6 -4
- data/lib/freddy/version.rb +1 -1
- data/lib/freddy.rb +17 -6
- data/spec/freddy/consumers/respond_to_consumer_spec.rb +3 -1
- data/spec/integration/tap_into_with_group_spec.rb +0 -5
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a0e451c899d3459fd4829f99e633035fa7e9c5499d0b30719b542557cb741cc
|
4
|
+
data.tar.gz: 9524f49be933a3f4b664111e8e06120e12bae0498379c2b8fb49820a90109404
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7af1a8a054e2fa285939f94b6dc696b249a6c83a0659802cd60fb88dea6e1aa067bf2dbd22b09a7cbfb75e3c0e579535801f9f10849f90302211f9d60847d96b
|
7
|
+
data.tar.gz: 11eeba115b4677a1523c95f365ce4cd87a1e5c33d649b7a548effb0a2760b1d43c2f1778e38fafa2ba2ab4007db075d13e6846d78cf5df4f18ef79aca862e67d
|
data/.github/workflows/ci.yml
CHANGED
@@ -14,7 +14,7 @@ jobs:
|
|
14
14
|
ruby-version: ['3.2']
|
15
15
|
services:
|
16
16
|
rabbitmq:
|
17
|
-
image: public.ecr.aws/docker/library/rabbitmq:
|
17
|
+
image: public.ecr.aws/docker/library/rabbitmq:4.0
|
18
18
|
ports:
|
19
19
|
- 5672:5672
|
20
20
|
options: --health-cmd "rabbitmqctl node_health_check" --health-interval 10s --health-timeout 5s --health-retries 5
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.3.
|
1
|
+
3.3.8
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
freddy (2.
|
5
|
-
bunny (~> 2.
|
4
|
+
freddy (2.11.0)
|
5
|
+
bunny (~> 2.24)
|
6
6
|
concurrent-ruby (~> 1.0)
|
7
7
|
oj (~> 3.6)
|
8
8
|
opentelemetry-api (~> 1.0)
|
@@ -19,7 +19,7 @@ GEM
|
|
19
19
|
amq-protocol (~> 2.3)
|
20
20
|
sorted_set (~> 1, >= 1.0.2)
|
21
21
|
coderay (1.1.3)
|
22
|
-
concurrent-ruby (1.3.
|
22
|
+
concurrent-ruby (1.3.5)
|
23
23
|
diff-lcs (1.4.4)
|
24
24
|
hamster (3.0.0)
|
25
25
|
concurrent-ruby (~> 1.0)
|
@@ -29,7 +29,7 @@ GEM
|
|
29
29
|
oj (3.16.10)
|
30
30
|
bigdecimal (>= 3.0)
|
31
31
|
ostruct (>= 0.2)
|
32
|
-
opentelemetry-api (1.
|
32
|
+
opentelemetry-api (1.5.0)
|
33
33
|
opentelemetry-common (0.19.6)
|
34
34
|
opentelemetry-api (~> 1.0)
|
35
35
|
opentelemetry-registry (0.2.0)
|
@@ -39,7 +39,7 @@ GEM
|
|
39
39
|
opentelemetry-common (~> 0.19.3)
|
40
40
|
opentelemetry-registry (~> 0.2)
|
41
41
|
opentelemetry-semantic_conventions
|
42
|
-
opentelemetry-semantic_conventions (1.
|
42
|
+
opentelemetry-semantic_conventions (1.11.0)
|
43
43
|
opentelemetry-api (~> 1.0)
|
44
44
|
ostruct (0.6.1)
|
45
45
|
parallel (1.26.3)
|
@@ -107,4 +107,4 @@ DEPENDENCIES
|
|
107
107
|
rubocop-rspec (~> 3.3)
|
108
108
|
|
109
109
|
BUNDLED WITH
|
110
|
-
2.
|
110
|
+
2.5.22
|
data/freddy.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.require_paths = ['lib']
|
19
19
|
|
20
|
-
spec.add_dependency 'bunny', '~> 2.
|
20
|
+
spec.add_dependency 'bunny', '~> 2.24'
|
21
21
|
spec.add_dependency 'concurrent-ruby', '~> 1.0'
|
22
22
|
spec.add_dependency 'oj', '~> 3.6'
|
23
23
|
spec.add_dependency 'opentelemetry-api', '~> 1.0'
|
@@ -7,11 +7,12 @@ class Freddy
|
|
7
7
|
new(**attrs).consume(&)
|
8
8
|
end
|
9
9
|
|
10
|
-
def initialize(thread_pool:, destination:, channel:, handler_adapter_factory:)
|
10
|
+
def initialize(thread_pool:, destination:, channel:, handler_adapter_factory:, options:)
|
11
11
|
@consume_thread_pool = thread_pool
|
12
12
|
@destination = destination
|
13
13
|
@channel = channel
|
14
14
|
@handler_adapter_factory = handler_adapter_factory
|
15
|
+
@options = options
|
15
16
|
end
|
16
17
|
|
17
18
|
def consume
|
@@ -28,7 +29,9 @@ class Freddy
|
|
28
29
|
private
|
29
30
|
|
30
31
|
def consume_from_destination(&block)
|
31
|
-
@channel.queue(
|
32
|
+
@channel.queue(
|
33
|
+
@destination, durable: durable?, no_declare: no_declare?
|
34
|
+
).subscribe(manual_ack: true) do |delivery|
|
32
35
|
process_message(delivery, &block)
|
33
36
|
end
|
34
37
|
end
|
@@ -42,6 +45,14 @@ class Freddy
|
|
42
45
|
@channel.acknowledge(delivery.tag, false)
|
43
46
|
end
|
44
47
|
end
|
48
|
+
|
49
|
+
def durable?
|
50
|
+
@options.fetch(:durable, true)
|
51
|
+
end
|
52
|
+
|
53
|
+
def no_declare?
|
54
|
+
@options.fetch(:no_declare, Freddy::DEFAULT_NO_DECLARE)
|
55
|
+
end
|
45
56
|
end
|
46
57
|
end
|
47
58
|
end
|
@@ -12,8 +12,6 @@ class Freddy
|
|
12
12
|
@patterns = patterns
|
13
13
|
@channel = channel
|
14
14
|
@options = options
|
15
|
-
|
16
|
-
raise 'Do not use durable queues without specifying a group' if durable? && !group
|
17
15
|
end
|
18
16
|
|
19
17
|
def consume(&block)
|
@@ -33,7 +31,7 @@ class Freddy
|
|
33
31
|
|
34
32
|
queue =
|
35
33
|
if group
|
36
|
-
@channel.queue("groups.#{group}", durable: durable?)
|
34
|
+
@channel.queue("groups.#{group}", durable: durable?, no_declare: no_declare?)
|
37
35
|
else
|
38
36
|
@channel.queue('', exclusive: true)
|
39
37
|
end
|
@@ -70,7 +68,11 @@ class Freddy
|
|
70
68
|
end
|
71
69
|
|
72
70
|
def durable?
|
73
|
-
@options.fetch(:durable,
|
71
|
+
@options.fetch(:durable, true)
|
72
|
+
end
|
73
|
+
|
74
|
+
def no_declare?
|
75
|
+
@options.fetch(:no_declare, Freddy::DEFAULT_NO_DECLARE)
|
74
76
|
end
|
75
77
|
|
76
78
|
def on_exception
|
data/lib/freddy/version.rb
CHANGED
data/lib/freddy.rb
CHANGED
@@ -12,6 +12,7 @@ Dir["#{File.dirname(__FILE__)}/freddy/*.rb"].each(&method(:require))
|
|
12
12
|
class Freddy
|
13
13
|
FREDDY_TOPIC_EXCHANGE_NAME = 'freddy-topic'
|
14
14
|
DEFAULT_MAX_CONCURRENCY = 4
|
15
|
+
DEFAULT_NO_DECLARE = false
|
15
16
|
|
16
17
|
# Creates a new freddy instance
|
17
18
|
#
|
@@ -24,14 +25,17 @@ class Freddy
|
|
24
25
|
# @option config [String] :user ('guest')
|
25
26
|
# @option config [String] :pass ('guest')
|
26
27
|
# @option config [Integer] :max_concurrency (4)
|
28
|
+
# @option config [Boolean] :no_declare (false)
|
27
29
|
#
|
28
30
|
# @return [Freddy]
|
29
31
|
#
|
30
32
|
# @example
|
31
33
|
# Freddy.build(Logger.new($stdout), user: 'thumper', pass: 'howdy')
|
32
|
-
def self.build(
|
34
|
+
def self.build(
|
35
|
+
logger = Logger.new($stdout), max_concurrency: DEFAULT_MAX_CONCURRENCY, no_declare: DEFAULT_NO_DECLARE, **config
|
36
|
+
)
|
33
37
|
connection = Adapters.determine.connect(config)
|
34
|
-
new(connection, logger, max_concurrency)
|
38
|
+
new(connection, logger, max_concurrency, no_declare)
|
35
39
|
end
|
36
40
|
|
37
41
|
# @private
|
@@ -39,10 +43,11 @@ class Freddy
|
|
39
43
|
@tracer ||= OpenTelemetry.tracer_provider.tracer('freddy', Freddy::VERSION)
|
40
44
|
end
|
41
45
|
|
42
|
-
def initialize(connection, logger, max_concurrency)
|
46
|
+
def initialize(connection, logger, max_concurrency, no_declare)
|
43
47
|
@connection = connection
|
44
48
|
@logger = logger
|
45
49
|
@prefetch_buffer_size = max_concurrency
|
50
|
+
@no_declare = no_declare
|
46
51
|
|
47
52
|
@send_and_forget_producer = Producers::SendAndForgetProducer.new(
|
48
53
|
connection.create_channel, logger
|
@@ -77,18 +82,21 @@ class Freddy
|
|
77
82
|
# handler.error(message: 'Can not do')
|
78
83
|
# end
|
79
84
|
# end
|
80
|
-
def respond_to(destination, &)
|
85
|
+
def respond_to(destination, options = {}, &)
|
81
86
|
@logger.info "Listening for requests on #{destination}"
|
82
87
|
|
83
88
|
channel = @connection.create_channel(prefetch: @prefetch_buffer_size)
|
84
89
|
producer = Producers::ReplyProducer.new(channel, @logger)
|
85
90
|
handler_adapter_factory = MessageHandlerAdapters::Factory.new(producer)
|
86
91
|
|
92
|
+
options[:no_declare] = options[:no_declare] || @no_declare
|
93
|
+
|
87
94
|
Consumers::RespondToConsumer.consume(
|
88
95
|
thread_pool: Concurrent::FixedThreadPool.new(@prefetch_buffer_size),
|
89
96
|
destination: destination,
|
90
97
|
channel: channel,
|
91
98
|
handler_adapter_factory: handler_adapter_factory,
|
99
|
+
options: options,
|
92
100
|
&
|
93
101
|
)
|
94
102
|
end
|
@@ -107,8 +115,9 @@ class Freddy
|
|
107
115
|
# only one of the listeners in given group will receive a message. All
|
108
116
|
# listeners will receive a message if the group is not specified.
|
109
117
|
# @option options [Boolean] :durable
|
110
|
-
# Should the consumer queue be durable? Default is `
|
111
|
-
# be used only in combination with option `:group`.
|
118
|
+
# Should the consumer queue be durable? Default is `nil` - let server decide.
|
119
|
+
# This option can be used only in combination with option `:group`.
|
120
|
+
# Note that queues *must be durable* with "quorum" queue types.
|
112
121
|
# @option options [Boolean] :on_exception
|
113
122
|
# Defines consumer's behaviour when the callback fails to process a message
|
114
123
|
# and raises an exception. Can be one of `:ack`, `:reject` or `:requeue`.
|
@@ -135,6 +144,8 @@ class Freddy
|
|
135
144
|
def tap_into(pattern_or_patterns, options = {}, &)
|
136
145
|
@logger.debug "Tapping into messages that match #{pattern_or_patterns}"
|
137
146
|
|
147
|
+
options[:no_declare] = options[:no_declare] || @no_declare
|
148
|
+
|
138
149
|
Consumers::TapIntoConsumer.consume(
|
139
150
|
thread_pool: Concurrent::FixedThreadPool.new(@prefetch_buffer_size),
|
140
151
|
patterns: Array(pattern_or_patterns),
|
@@ -6,7 +6,8 @@ describe Freddy::Consumers::RespondToConsumer do
|
|
6
6
|
thread_pool: thread_pool,
|
7
7
|
destination: destination,
|
8
8
|
channel: channel,
|
9
|
-
handler_adapter_factory: msg_handler_adapter_factory
|
9
|
+
handler_adapter_factory: msg_handler_adapter_factory,
|
10
|
+
options: options
|
10
11
|
)
|
11
12
|
end
|
12
13
|
|
@@ -17,6 +18,7 @@ describe Freddy::Consumers::RespondToConsumer do
|
|
17
18
|
let(:msg_handler_adapter) { Freddy::MessageHandlerAdapters::NoOpHandler.new }
|
18
19
|
let(:prefetch_buffer_size) { 2 }
|
19
20
|
let(:thread_pool) { Concurrent::FixedThreadPool.new(prefetch_buffer_size) }
|
21
|
+
let(:options) { { durable: false } }
|
20
22
|
|
21
23
|
after do
|
22
24
|
connection.close
|
@@ -11,11 +11,6 @@ describe 'Tapping into with group identifier' do
|
|
11
11
|
|
12
12
|
after { [deliverer, responder1, responder2].each(&:close) }
|
13
13
|
|
14
|
-
it 'raises an exception if option :durable is provided without group' do
|
15
|
-
expect { responder1.tap_into(destination, durable: true) }
|
16
|
-
.to raise_error(RuntimeError)
|
17
|
-
end
|
18
|
-
|
19
14
|
it 'receives a message once' do
|
20
15
|
msg_counter = Hamster::MutableSet[]
|
21
16
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: freddy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Glia TechMovers
|
@@ -15,14 +15,14 @@ dependencies:
|
|
15
15
|
requirements:
|
16
16
|
- - "~>"
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version: '2.
|
18
|
+
version: '2.24'
|
19
19
|
type: :runtime
|
20
20
|
prerelease: false
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
22
22
|
requirements:
|
23
23
|
- - "~>"
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version: '2.
|
25
|
+
version: '2.24'
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: concurrent-ruby
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|