action_subscriber 3.0.2-java → 4.0.0-java
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/README.md +41 -7
- data/action_subscriber.gemspec +0 -1
- data/bin/action_subscriber +7 -15
- data/lib/action_subscriber.rb +10 -49
- data/lib/action_subscriber/babou.rb +7 -43
- data/lib/action_subscriber/base.rb +0 -70
- data/lib/action_subscriber/bunny/subscriber.rb +43 -41
- data/lib/action_subscriber/configuration.rb +1 -7
- data/lib/action_subscriber/dsl.rb +95 -3
- data/lib/action_subscriber/march_hare/subscriber.rb +41 -51
- data/lib/action_subscriber/route.rb +0 -1
- data/lib/action_subscriber/route_set.rb +5 -19
- data/lib/action_subscriber/version.rb +1 -1
- data/spec/integration/around_filters_spec.rb +1 -1
- data/spec/integration/at_least_once_spec.rb +1 -1
- data/spec/integration/at_most_once_spec.rb +45 -9
- data/spec/integration/automatic_reconnect_spec.rb +28 -28
- data/spec/integration/basic_subscriber_spec.rb +5 -18
- data/spec/integration/custom_actions_spec.rb +1 -1
- data/spec/integration/custom_headers_spec.rb +3 -11
- data/spec/integration/decoding_payloads_spec.rb +2 -2
- data/spec/integration/manual_acknowledgement_spec.rb +1 -1
- data/spec/integration/multiple_connections_spec.rb +1 -1
- data/spec/lib/action_subscriber/configuration_spec.rb +0 -3
- data/spec/spec_helper.rb +2 -2
- metadata +3 -22
- data/lib/action_subscriber/threadpool.rb +0 -62
- data/spec/integration/multiple_threadpools_spec.rb +0 -29
- data/spec/lib/action_subscriber/threadpool_spec.rb +0 -47
@@ -11,25 +11,12 @@ describe "A Basic Subscriber", :integration => true do
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
it "routes messages to the right place" do
|
15
|
+
::ActionSubscriber.start_subscribers!
|
16
|
+
::ActivePublisher.publish("basic_push.booked", "Ohai Booked", "events")
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
expect($messages).to eq(Set.new(["Ohai Booked"]))
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context "ActionSubscriber.auto_subscribe!" do
|
26
|
-
it "routes messages to the right place" do
|
27
|
-
::ActionSubscriber.auto_subscribe!
|
28
|
-
::ActivePublisher.publish("basic_push.booked", "Ohai Booked", "events")
|
29
|
-
|
30
|
-
verify_expectation_within(2.0) do
|
31
|
-
expect($messages).to eq(Set.new(["Ohai Booked"]))
|
32
|
-
end
|
18
|
+
verify_expectation_within(2.0) do
|
19
|
+
expect($messages).to eq(Set.new(["Ohai Booked"]))
|
33
20
|
end
|
34
21
|
end
|
35
22
|
end
|
@@ -14,7 +14,7 @@ describe "A subscriber with a custom action", :integration => true do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "routes the message to the selected action" do
|
17
|
-
::ActionSubscriber.
|
17
|
+
::ActionSubscriber.start_subscribers!
|
18
18
|
::ActivePublisher.publish("react.javascript_framework", "Another?!?!", "events")
|
19
19
|
|
20
20
|
verify_expectation_within(2.0) do
|
@@ -13,17 +13,9 @@ describe "Custom Headers Are Published and Received", :integration => true do
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
let(:headers) { { "Custom" => "content/header" } }
|
16
|
-
|
17
|
-
it "
|
18
|
-
::
|
19
|
-
verify_expectation_within(2.0) do
|
20
|
-
::ActionSubscriber.auto_pop!
|
21
|
-
expect($messages).to eq(Set.new([headers]))
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
it "works for auto_subscriber!" do
|
26
|
-
::ActionSubscriber.auto_subscribe!
|
16
|
+
|
17
|
+
it "passes custom headers through" do
|
18
|
+
::ActionSubscriber.start_subscribers!
|
27
19
|
::ActivePublisher.publish("pikitis.prank.pulled", "Yo Knope!", "events", :headers => headers)
|
28
20
|
verify_expectation_within(2.0) do
|
29
21
|
expect($messages).to eq(Set.new([headers]))
|
@@ -19,7 +19,7 @@ describe "Payload Decoding", :integration => true do
|
|
19
19
|
let(:json_string) { '{"foo": "bar"}' }
|
20
20
|
|
21
21
|
it "decodes json by default" do
|
22
|
-
::ActionSubscriber.
|
22
|
+
::ActionSubscriber.start_subscribers!
|
23
23
|
::ActivePublisher.publish("twitter.tweet", json_string, "events", :content_type => "application/json")
|
24
24
|
|
25
25
|
verify_expectation_within(2.0) do
|
@@ -37,7 +37,7 @@ describe "Payload Decoding", :integration => true do
|
|
37
37
|
after { ::ActionSubscriber.config.decoder.delete(content_type) }
|
38
38
|
|
39
39
|
it "it decodes the payload using the custom decoder" do
|
40
|
-
::ActionSubscriber.
|
40
|
+
::ActionSubscriber.start_subscribers!
|
41
41
|
::ActivePublisher.publish("twitter.tweet", json_string, "events", :content_type => content_type)
|
42
42
|
|
43
43
|
verify_expectation_within(2.0) do
|
@@ -21,7 +21,7 @@ describe "Manual Message Acknowledgment", :integration => true do
|
|
21
21
|
let(:subscriber) { BaconSubscriber }
|
22
22
|
|
23
23
|
it "retries rejected messages and stops retrying acknowledged messages" do
|
24
|
-
::ActionSubscriber.
|
24
|
+
::ActionSubscriber.start_subscribers!
|
25
25
|
::ActivePublisher.publish("bacon.served", "BACON!", "events")
|
26
26
|
|
27
27
|
verify_expectation_within(2.0) do
|
@@ -24,7 +24,7 @@ describe "Separate connections to get multiple threadpools", :integration => tru
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it "spreads the load across multiple threadpools and consumer" do
|
27
|
-
::ActionSubscriber.
|
27
|
+
::ActionSubscriber.start_subscribers!
|
28
28
|
1.upto(10).each do |i|
|
29
29
|
::ActivePublisher.publish("multiple_connections.burp", "belch#{i}", "events")
|
30
30
|
end
|
@@ -4,14 +4,11 @@ describe ::ActionSubscriber::Configuration do
|
|
4
4
|
specify { expect(subject.default_exchange).to eq("events") }
|
5
5
|
specify { expect(subject.heartbeat).to eq(5) }
|
6
6
|
specify { expect(subject.host).to eq("localhost") }
|
7
|
-
specify { expect(subject.mode).to eq('subscribe') }
|
8
|
-
specify { expect(subject.pop_interval).to eq(100) }
|
9
7
|
specify { expect(subject.port).to eq(5672) }
|
10
8
|
specify { expect(subject.prefetch).to eq(2) }
|
11
9
|
specify { expect(subject.seconds_to_wait_for_graceful_shutdown).to eq(30) }
|
12
10
|
specify { expect(subject.threadpool_size).to eq(8) }
|
13
11
|
specify { expect(subject.timeout).to eq(1) }
|
14
|
-
specify { expect(subject.times_to_pop).to eq(8) }
|
15
12
|
end
|
16
13
|
|
17
14
|
describe "add_decoder" do
|
data/spec/spec_helper.rb
CHANGED
@@ -28,12 +28,12 @@ RSpec.configure do |config|
|
|
28
28
|
::ActionSubscriber.setup_subscriptions!
|
29
29
|
end
|
30
30
|
config.after(:each, :integration => true) do
|
31
|
-
::ActionSubscriber.stop_subscribers!
|
31
|
+
::ActionSubscriber.stop_subscribers!(0.1)
|
32
32
|
::ActionSubscriber.instance_variable_set("@route_set", nil)
|
33
33
|
::ActionSubscriber.instance_variable_set("@route_set_block", nil)
|
34
34
|
end
|
35
35
|
config.after(:suite) do
|
36
|
-
::ActionSubscriber.stop_subscribers!
|
36
|
+
::ActionSubscriber.stop_subscribers!(0.1)
|
37
37
|
::ActionSubscriber::RabbitConnection.subscriber_disconnect!
|
38
38
|
end
|
39
39
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: action_subscriber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Brian Stien
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2016-09-
|
15
|
+
date: 2016-09-30 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
requirement: !ruby/object:Gem::Requirement
|
@@ -42,20 +42,6 @@ dependencies:
|
|
42
42
|
- - ">="
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
version: 2.7.0
|
45
|
-
- !ruby/object:Gem::Dependency
|
46
|
-
requirement: !ruby/object:Gem::Requirement
|
47
|
-
requirements:
|
48
|
-
- - ">="
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
version: 0.0.9
|
51
|
-
name: lifeguard
|
52
|
-
prerelease: false
|
53
|
-
type: :runtime
|
54
|
-
version_requirements: !ruby/object:Gem::Requirement
|
55
|
-
requirements:
|
56
|
-
- - ">="
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
version: 0.0.9
|
59
45
|
- !ruby/object:Gem::Dependency
|
60
46
|
requirement: !ruby/object:Gem::Requirement
|
61
47
|
requirements:
|
@@ -234,7 +220,6 @@ files:
|
|
234
220
|
- lib/action_subscriber/router.rb
|
235
221
|
- lib/action_subscriber/rspec.rb
|
236
222
|
- lib/action_subscriber/subscribable.rb
|
237
|
-
- lib/action_subscriber/threadpool.rb
|
238
223
|
- lib/action_subscriber/uri.rb
|
239
224
|
- lib/action_subscriber/version.rb
|
240
225
|
- routing.md
|
@@ -248,7 +233,6 @@ files:
|
|
248
233
|
- spec/integration/decoding_payloads_spec.rb
|
249
234
|
- spec/integration/manual_acknowledgement_spec.rb
|
250
235
|
- spec/integration/multiple_connections_spec.rb
|
251
|
-
- spec/integration/multiple_threadpools_spec.rb
|
252
236
|
- spec/lib/action_subscriber/base_spec.rb
|
253
237
|
- spec/lib/action_subscriber/configuration_spec.rb
|
254
238
|
- spec/lib/action_subscriber/dsl_spec.rb
|
@@ -261,7 +245,6 @@ files:
|
|
261
245
|
- spec/lib/action_subscriber/middleware/runner_spec.rb
|
262
246
|
- spec/lib/action_subscriber/router_spec.rb
|
263
247
|
- spec/lib/action_subscriber/subscribable_spec.rb
|
264
|
-
- spec/lib/action_subscriber/threadpool_spec.rb
|
265
248
|
- spec/spec_helper.rb
|
266
249
|
- spec/support/user_subscriber.rb
|
267
250
|
homepage: https://github.com/mxenabled/action_subscriber
|
@@ -284,7 +267,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
284
267
|
version: '0'
|
285
268
|
requirements: []
|
286
269
|
rubyforge_project:
|
287
|
-
rubygems_version: 2.6.
|
270
|
+
rubygems_version: 2.6.7
|
288
271
|
signing_key:
|
289
272
|
specification_version: 4
|
290
273
|
summary: ActionSubscriber is a DSL that allows a rails app to consume messages from a RabbitMQ broker.
|
@@ -299,7 +282,6 @@ test_files:
|
|
299
282
|
- spec/integration/decoding_payloads_spec.rb
|
300
283
|
- spec/integration/manual_acknowledgement_spec.rb
|
301
284
|
- spec/integration/multiple_connections_spec.rb
|
302
|
-
- spec/integration/multiple_threadpools_spec.rb
|
303
285
|
- spec/lib/action_subscriber/base_spec.rb
|
304
286
|
- spec/lib/action_subscriber/configuration_spec.rb
|
305
287
|
- spec/lib/action_subscriber/dsl_spec.rb
|
@@ -312,6 +294,5 @@ test_files:
|
|
312
294
|
- spec/lib/action_subscriber/middleware/runner_spec.rb
|
313
295
|
- spec/lib/action_subscriber/router_spec.rb
|
314
296
|
- spec/lib/action_subscriber/subscribable_spec.rb
|
315
|
-
- spec/lib/action_subscriber/threadpool_spec.rb
|
316
297
|
- spec/spec_helper.rb
|
317
298
|
- spec/support/user_subscriber.rb
|
@@ -1,62 +0,0 @@
|
|
1
|
-
module ActionSubscriber
|
2
|
-
class Threadpool
|
3
|
-
##
|
4
|
-
# Class Methods
|
5
|
-
#
|
6
|
-
def self.busy?
|
7
|
-
!ready?
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.new_pool(name, pool_size = nil)
|
11
|
-
fail ArgumentError, "#{name} already exists as a threadpool" if pools.key?(name)
|
12
|
-
pool_size ||= ::ActionSubscriber.config.threadpool_size
|
13
|
-
pools[name] = ::Lifeguard::InfiniteThreadpool.new(
|
14
|
-
:name => name,
|
15
|
-
:pool_size => pool_size
|
16
|
-
)
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.pool(which_pool = :default)
|
20
|
-
pools[which_pool]
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.pools
|
24
|
-
@pools ||= {
|
25
|
-
:default => ::Lifeguard::InfiniteThreadpool.new(
|
26
|
-
:name => :default,
|
27
|
-
:pool_size => ::ActionSubscriber.config.threadpool_size
|
28
|
-
)
|
29
|
-
}
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.ready?
|
33
|
-
pools.any? { |_pool_name, pool| !pool.busy? }
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.ready_size
|
37
|
-
pools.inject(0) do |total_ready, (_pool_name, pool)|
|
38
|
-
total_ready + [0, pool.pool_size - pool.busy_size].max
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.wait_to_finish_with_timeout(timeout)
|
43
|
-
wait_loops = 0
|
44
|
-
loop do
|
45
|
-
wait_loops = wait_loops + 1
|
46
|
-
any_threadpools_busy = false
|
47
|
-
pools.each do |name, pool|
|
48
|
-
next if pool.busy_size <= 0
|
49
|
-
puts " -- #{name} (remaining: #{pool.busy_size})"
|
50
|
-
any_threadpools_busy = true
|
51
|
-
end
|
52
|
-
if !any_threadpools_busy
|
53
|
-
puts " -- Lifeguard threadpools empty"
|
54
|
-
break
|
55
|
-
end
|
56
|
-
break if wait_loops >= timeout
|
57
|
-
Thread.pass
|
58
|
-
sleep 1
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
class DifferentThreadpoolsSubscriber < ActionSubscriber::Base
|
2
|
-
def one
|
3
|
-
$messages << payload
|
4
|
-
end
|
5
|
-
|
6
|
-
def two
|
7
|
-
$messages << payload
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
describe "Separate Threadpools for Different Message", :integration => true do
|
12
|
-
let(:draw_routes) do
|
13
|
-
low_priority_threadpool = ::ActionSubscriber::Threadpool.new_pool(:low_priority, 1)
|
14
|
-
::ActionSubscriber.draw_routes do
|
15
|
-
route DifferentThreadpoolsSubscriber, :one
|
16
|
-
route DifferentThreadpoolsSubscriber, :two, :threadpool => low_priority_threadpool
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
it "processes messages in separate threadpools based on the routes" do
|
21
|
-
::ActivePublisher.publish("different_threadpools.one", "ONE", "events")
|
22
|
-
::ActivePublisher.publish("different_threadpools.two", "TWO", "events")
|
23
|
-
|
24
|
-
verify_expectation_within(2.0) do
|
25
|
-
::ActionSubscriber.auto_pop!
|
26
|
-
expect($messages).to eq(Set.new(["ONE","TWO"]))
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
describe ::ActionSubscriber::Threadpool do
|
2
|
-
describe "busy?" do
|
3
|
-
context "when the pool is busy" do
|
4
|
-
it "returns true" do
|
5
|
-
allow(::ActionSubscriber::Threadpool).to receive(:ready?).and_return(false)
|
6
|
-
expect(::ActionSubscriber::Threadpool).to be_busy
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
context "when the pool is not busy" do
|
11
|
-
it "returns false" do
|
12
|
-
allow(::ActionSubscriber::Threadpool).to receive(:ready?).and_return(true)
|
13
|
-
expect(::ActionSubscriber::Threadpool).to_not be_busy
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe "ready?" do
|
19
|
-
context "when all the workers are full" do
|
20
|
-
it "returns false" do
|
21
|
-
::ActionSubscriber::Threadpool.new_pool(:some_dumb_pool, 2)
|
22
|
-
|
23
|
-
::ActionSubscriber::Threadpool.pools.map do |_name, pool|
|
24
|
-
allow(pool).to receive(:busy_size).and_return(pool.pool_size)
|
25
|
-
end
|
26
|
-
|
27
|
-
expect(::ActionSubscriber::Threadpool).to_not be_ready
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "when only one of the workers is full" do
|
32
|
-
it "returns true" do
|
33
|
-
pool = ::ActionSubscriber::Threadpool.new_pool(:some_other_dumb_pool, 2)
|
34
|
-
allow(pool).to receive(:busy_size).and_return(2)
|
35
|
-
|
36
|
-
expect(::ActionSubscriber::Threadpool).to be_ready
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
context "when there are idle workers" do
|
41
|
-
it "returns true" do
|
42
|
-
allow(::ActionSubscriber::Threadpool.pool).to receive(:busy_size).and_return(1)
|
43
|
-
expect(::ActionSubscriber::Threadpool).to be_ready
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|