action_subscriber 3.0.2 → 4.0.0.pre1
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 +4 -23
- 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.pre1
|
5
5
|
platform: ruby
|
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-27 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: activesupport
|
@@ -42,20 +42,6 @@ dependencies:
|
|
42
42
|
- - ">="
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
version: 1.5.0
|
45
|
-
- !ruby/object:Gem::Dependency
|
46
|
-
name: lifeguard
|
47
|
-
requirement: !ruby/object:Gem::Requirement
|
48
|
-
requirements:
|
49
|
-
- - ">="
|
50
|
-
- !ruby/object:Gem::Version
|
51
|
-
version: 0.0.9
|
52
|
-
type: :runtime
|
53
|
-
prerelease: false
|
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
|
name: middleware
|
61
47
|
requirement: !ruby/object:Gem::Requirement
|
@@ -235,7 +221,6 @@ files:
|
|
235
221
|
- lib/action_subscriber/router.rb
|
236
222
|
- lib/action_subscriber/rspec.rb
|
237
223
|
- lib/action_subscriber/subscribable.rb
|
238
|
-
- lib/action_subscriber/threadpool.rb
|
239
224
|
- lib/action_subscriber/uri.rb
|
240
225
|
- lib/action_subscriber/version.rb
|
241
226
|
- routing.md
|
@@ -249,7 +234,6 @@ files:
|
|
249
234
|
- spec/integration/decoding_payloads_spec.rb
|
250
235
|
- spec/integration/manual_acknowledgement_spec.rb
|
251
236
|
- spec/integration/multiple_connections_spec.rb
|
252
|
-
- spec/integration/multiple_threadpools_spec.rb
|
253
237
|
- spec/lib/action_subscriber/base_spec.rb
|
254
238
|
- spec/lib/action_subscriber/configuration_spec.rb
|
255
239
|
- spec/lib/action_subscriber/dsl_spec.rb
|
@@ -262,7 +246,6 @@ files:
|
|
262
246
|
- spec/lib/action_subscriber/middleware/runner_spec.rb
|
263
247
|
- spec/lib/action_subscriber/router_spec.rb
|
264
248
|
- spec/lib/action_subscriber/subscribable_spec.rb
|
265
|
-
- spec/lib/action_subscriber/threadpool_spec.rb
|
266
249
|
- spec/spec_helper.rb
|
267
250
|
- spec/support/user_subscriber.rb
|
268
251
|
homepage: https://github.com/mxenabled/action_subscriber
|
@@ -280,9 +263,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
280
263
|
version: '0'
|
281
264
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
282
265
|
requirements:
|
283
|
-
- - "
|
266
|
+
- - ">"
|
284
267
|
- !ruby/object:Gem::Version
|
285
|
-
version:
|
268
|
+
version: 1.3.1
|
286
269
|
requirements: []
|
287
270
|
rubyforge_project:
|
288
271
|
rubygems_version: 2.6.6
|
@@ -301,7 +284,6 @@ test_files:
|
|
301
284
|
- spec/integration/decoding_payloads_spec.rb
|
302
285
|
- spec/integration/manual_acknowledgement_spec.rb
|
303
286
|
- spec/integration/multiple_connections_spec.rb
|
304
|
-
- spec/integration/multiple_threadpools_spec.rb
|
305
287
|
- spec/lib/action_subscriber/base_spec.rb
|
306
288
|
- spec/lib/action_subscriber/configuration_spec.rb
|
307
289
|
- spec/lib/action_subscriber/dsl_spec.rb
|
@@ -314,6 +296,5 @@ test_files:
|
|
314
296
|
- spec/lib/action_subscriber/middleware/runner_spec.rb
|
315
297
|
- spec/lib/action_subscriber/router_spec.rb
|
316
298
|
- spec/lib/action_subscriber/subscribable_spec.rb
|
317
|
-
- spec/lib/action_subscriber/threadpool_spec.rb
|
318
299
|
- spec/spec_helper.rb
|
319
300
|
- 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
|