action_subscriber 3.0.2 → 4.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|