hot_bunnies 1.5.0-java → 2.0.0.pre1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/lib/ext/rabbitmq-client.jar +0 -0
  2. data/lib/hot_bunnies/channel.rb +287 -9
  3. data/lib/hot_bunnies/consumers.rb +152 -0
  4. data/lib/hot_bunnies/exceptions.rb +151 -0
  5. data/lib/hot_bunnies/exchange.rb +22 -30
  6. data/lib/hot_bunnies/juc.rb +9 -0
  7. data/lib/hot_bunnies/metadata.rb +90 -0
  8. data/lib/hot_bunnies/queue.rb +52 -265
  9. data/lib/hot_bunnies/session.rb +170 -0
  10. data/lib/hot_bunnies/version.rb +1 -1
  11. data/lib/hot_bunnies.rb +5 -91
  12. metadata +15 -39
  13. data/.gitignore +0 -7
  14. data/.rvmrc +0 -1
  15. data/.travis.yml +0 -12
  16. data/ChangeLog.md +0 -46
  17. data/Gemfile +0 -10
  18. data/LICENSE +0 -20
  19. data/README.md +0 -58
  20. data/Rakefile +0 -6
  21. data/examples/blocking_subscription.rb +0 -36
  22. data/examples/non_blocking_subscription.rb +0 -32
  23. data/examples/non_blocking_subscription_with_executor.rb +0 -38
  24. data/hot_bunnies.gemspec +0 -24
  25. data/spec/integration/alternate_exchanges_spec.rb +0 -36
  26. data/spec/integration/basic_consume_spec.rb +0 -128
  27. data/spec/integration/connection_spec.rb +0 -26
  28. data/spec/integration/error_handling_by_consumers_spec.rb +0 -97
  29. data/spec/integration/exchange_bind_spec.rb +0 -35
  30. data/spec/integration/exchange_declare_spec.rb +0 -113
  31. data/spec/integration/message_metadata_access_spec.rb +0 -94
  32. data/spec/integration/publisher_confirmations_spec.rb +0 -51
  33. data/spec/integration/queue_bind_spec.rb +0 -56
  34. data/spec/integration/queue_declare_spec.rb +0 -44
  35. data/spec/integration/queue_delete_spec.rb +0 -23
  36. data/spec/integration/queue_purge_spec.rb +0 -38
  37. data/spec/integration/queue_unbind_spec.rb +0 -53
  38. data/spec/integration/sender_selected_distribution_spec.rb +0 -47
  39. data/spec/spec_helper.rb +0 -18
@@ -1,26 +0,0 @@
1
- require "spec_helper"
2
-
3
-
4
- describe "HotBunnies.connect" do
5
-
6
- #
7
- # Examples
8
- #
9
-
10
- it "lets you specify requested heartbeat interval" do
11
- c1 = HotBunnies.connect(:requested_heartbeat => 10)
12
- c1.close
13
- end
14
-
15
- it "lets you specify connection timeout interval" do
16
- c1 = HotBunnies.connect(:connection_timeout => 3)
17
- c1.close
18
- end
19
-
20
- if !ENV["CI"] && ENV["TLS_TESTS"]
21
- it "supports TLS w/o custom protocol or trust manager" do
22
- c1 = HotBunnies.connect(:tls => true, :port => 5671)
23
- c1.close
24
- end
25
- end
26
- end
@@ -1,97 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "An AMQP consumer that catches exceptions" do
4
- let(:connection) { HotBunnies.connect }
5
- let(:channel) { connection.create_channel }
6
-
7
- after :each do
8
- channel.close
9
- connection.close
10
- end
11
-
12
- it "stays up" do
13
- mailbox = []
14
- exchange = channel.exchange("hot_bunnies.exchanges.fanout#{Time.now.to_i}", :type => :fanout, :auto_delete => true)
15
- queue = channel.queue("", :auto_delete => true)
16
-
17
- queue.bind(exchange)
18
- consumer = queue.subscribe(:blocking => false) do |meta, payload|
19
- n = meta.properties.headers['X-Number']
20
-
21
- begin
22
- if n.odd?
23
- raise "A failure"
24
- else
25
- mailbox << payload
26
- end
27
- rescue Exception => e
28
- # no-op
29
- end
30
- end
31
-
32
- 25.times do |i|
33
- exchange.publish("Message ##{i}", :routing_key => "xyz", :properties => {
34
- :headers => {
35
- 'X-Number' => i
36
- }
37
- })
38
- end
39
-
40
- sleep(0.5)
41
-
42
- mc, cc = queue.status
43
- mc.should == 0
44
-
45
- mailbox.size.should == 13
46
- consumer.shutdown!
47
- end
48
- end
49
-
50
-
51
-
52
-
53
- describe "An AMQP consumer that DOES NOT catch exceptions" do
54
- let(:connection) { HotBunnies.connect }
55
- let(:channel) { connection.create_channel }
56
-
57
- after :each do
58
- channel.close
59
- connection.close
60
- end
61
-
62
- it "becomes inactive when the channels prefetch is filled with unacked messages" do
63
- mailbox = []
64
- exchange = channel.exchange("hot_bunnies.exchanges.fanout#{Time.now.to_i}#{rand}", :type => :fanout, :auto_delete => true)
65
- queue = channel.queue("", :auto_delete => true)
66
-
67
- channel.prefetch = 5
68
-
69
- queue.bind(exchange)
70
- consumer = queue.subscribe(:blocking => false, :ack => true) do |meta, payload|
71
- n = meta.properties.headers['X-Number']
72
-
73
- if n.odd?
74
- raise "A failure"
75
- else
76
- mailbox << payload
77
- meta.ack
78
- end
79
- end
80
-
81
- 25.times do |i|
82
- exchange.publish("Message ##{i}", :routing_key => "xyz", :properties => {
83
- :headers => {
84
- 'X-Number' => i
85
- }
86
- })
87
- end
88
-
89
- sleep(0.5)
90
-
91
- message_count, _ = queue.status
92
- message_count.should == 15
93
-
94
- mailbox.size.should == 5
95
- consumer.shutdown!
96
- end
97
- end
@@ -1,35 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe HotBunnies::Exchange do
4
- let(:connection) { HotBunnies.connect }
5
- let(:channel) { connection.create_channel }
6
-
7
- after :each do
8
- channel.close
9
- connection.close
10
- end
11
-
12
- it "should bind two exchanges using exchange instances" do
13
- source = channel.exchange("hot_bunnies.spec.exchanges.source", :auto_delete => true)
14
- destianation = channel.exchange("hot_bunnies.spec.exchanges.destination", :auto_delete => true)
15
-
16
- queue = channel.queue("", :auto_delete => true)
17
- queue.bind(destianation)
18
-
19
- destianation.bind(source)
20
- source.publish("")
21
- queue.get.should_not be_nil
22
- end
23
-
24
- it "should bind two exchanges using exchange name" do
25
- source = channel.exchange("hot_bunnies.spec.exchanges.source", :auto_delete => true)
26
- destianation = channel.exchange("hot_bunnies.spec.exchanges.destination", :auto_delete => true)
27
-
28
- queue = channel.queue("", :auto_delete => true)
29
- queue.bind(destianation)
30
-
31
- destianation.bind(source.name)
32
- source.publish("")
33
- queue.get.should_not be_nil
34
- end
35
- end
@@ -1,113 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Direct exchange" do
4
- let(:connection) { HotBunnies.connect }
5
- let(:channel) { connection.create_channel }
6
-
7
- after :each do
8
- channel.close
9
- connection.close
10
- end
11
-
12
- it "can be declared" do
13
- exchange = channel.exchange("hot_bunnies.exchanges.direct1", :type => :direct)
14
- queue = channel.queue("", :auto_delete => true)
15
-
16
- queue.bind(exchange, :routing_key => "abc")
17
-
18
- exchange.publish("", :routing_key => "xyz")
19
- exchange.publish("", :routing_key => "abc")
20
-
21
- sleep(0.3)
22
-
23
- mc, cc = queue.status
24
- mc.should == 1
25
- end
26
- end
27
-
28
-
29
-
30
- describe "Fanout exchange" do
31
- let(:connection) { HotBunnies.connect }
32
- let(:channel) { connection.create_channel }
33
-
34
- after :each do
35
- channel.close
36
- connection.close
37
- end
38
-
39
- it "can be declared" do
40
- exchange = channel.exchange("hot_bunnies.exchanges.fanout1", :type => :fanout)
41
- queue = channel.queue("", :auto_delete => true)
42
-
43
- queue.bind(exchange)
44
-
45
- exchange.publish("")
46
- exchange.publish("", :routing_key => "xyz")
47
- exchange.publish("", :routing_key => "abc")
48
-
49
- sleep(0.5)
50
-
51
- mc, cc = queue.status
52
- mc.should == 3
53
- end
54
- end
55
-
56
-
57
-
58
- describe "Topic exchange" do
59
- let(:connection) { HotBunnies.connect }
60
- let(:channel) { connection.create_channel }
61
-
62
- after :each do
63
- channel.close
64
- connection.close
65
- end
66
-
67
- it "can be declared" do
68
- exchange = channel.exchange("hot_bunnies.exchanges.topic1", :type => :topic)
69
- queue = channel.queue("", :auto_delete => true)
70
-
71
- queue.bind(exchange, :routing_key => "log.*")
72
-
73
- exchange.publish("")
74
- exchange.publish("", :routing_key => "accounts.signup")
75
- exchange.publish("", :routing_key => "log.info")
76
- exchange.publish("", :routing_key => "log.warn")
77
-
78
- sleep(0.5)
79
-
80
- mc, cc = queue.status
81
- mc.should == 2
82
- end
83
- end
84
-
85
-
86
-
87
- describe "Headers exchange" do
88
- let(:connection) { HotBunnies.connect }
89
- let(:channel) { connection.create_channel }
90
-
91
- after :each do
92
- channel.close
93
- connection.close
94
- end
95
-
96
- it "can be declared" do
97
- exchange = channel.exchange("hot_bunnies.exchanges.headers1", :type => :headers)
98
- queue = channel.queue("", :auto_delete => true)
99
-
100
- queue.bind(exchange, :arguments => { 'x-match' => 'all', 'arch' => "x86_64", 'os' => "linux" })
101
-
102
- exchange.publish "For linux/IA64", :properties => { :headers => { 'arch' => "x86_64", 'os' => 'linux' } }
103
- exchange.publish "For linux/x86", :properties => { :headers => { 'arch' => "x86", 'os' => 'linux' } }
104
- exchange.publish "For any linux", :properties => { :headers => { 'os' => 'linux' } }
105
- exchange.publish "For OS X", :properties => { :headers => { 'os' => 'macosx' } }
106
- exchange.publish "For solaris/IA64", :properties => { :headers => { 'os' => 'solaris', 'arch' => 'x86_64' } }
107
-
108
- sleep(0.3)
109
-
110
- mc, cc = queue.status
111
- mc.should == 1
112
- end
113
- end
@@ -1,94 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "An AMQP consumer" do
4
- let(:connection) { HotBunnies.connect }
5
- let(:channel) { connection.create_channel }
6
-
7
- after :each do
8
- channel.close
9
- connection.close
10
- end
11
-
12
- it "can access message metadata (both message properties and delivery information)" do
13
- latch = java.util.concurrent.CountDownLatch.new(1)
14
- queue = channel.queue("", :auto_delete => true)
15
- exchange = channel.exchange("amq.fanout", :type => :fanout)
16
-
17
- queue.bind(exchange, :routing_key => "hotbunnies.key")
18
-
19
- @now = Time.now
20
- @payload = "Hello, world!"
21
- @meta = nil
22
-
23
- consumer = queue.subscribe(:blocking => false) do |metadata, payload|
24
- begin
25
- # we will run assertions on the main thread because RSpec uses exceptions
26
- # for its purposes every once in a while. MK.
27
- @meta = metadata
28
- rescue Exception => e
29
- e.print_stack_trace
30
- ensure
31
- latch.count_down
32
- end
33
- end
34
-
35
- exchange.publish(@payload,
36
- :properties => { :app_id => "hotbunnies.tests",
37
- :priority => 8,
38
- :type => "kinda.checkin",
39
- # headers table keys can be anything
40
- :headers => {
41
- "coordinates" => {
42
- "latitude" => 59.35,
43
- "longitude" => 18.066667
44
- },
45
- "time" => @now,
46
- "participants" => 11,
47
- "venue" => "Stockholm",
48
- "true_field" => true,
49
- "false_field" => false,
50
- "nil_field" => nil,
51
- "ary_field" => ["one", 2.0, 3, [{ "abc" => 123 }]]
52
- },
53
- :timestamp => @now,
54
- :reply_to => "a.sender",
55
- :correlation_id => "r-1",
56
- :message_id => "m-1",
57
- :content_type => "application/octet-stream",
58
- # just an example. MK.
59
- :content_encoding => "zip/zap"
60
- },
61
- :routing_key => "hotbunnies.key")
62
- latch.await
63
-
64
- @meta.routing_key.should == "hotbunnies.key"
65
- @meta.content_type.should == "application/octet-stream"
66
- @meta.content_encoding.should == "zip/zap"
67
- @meta.priority.should == 8
68
-
69
- time = Time.at(@meta.headers["time"].getTime/1000)
70
- time.to_i.should == @now.to_i
71
-
72
- @meta.headers["coordinates"]["latitude"].should == 59.35
73
- @meta.headers["participants"].should == 11
74
- @meta.headers["true_field"].should == true
75
- @meta.headers["false_field"].should == false
76
- @meta.headers["nil_field"].should be_nil
77
-
78
- @meta.timestamp.should == Time.at(@now.to_i)
79
- @meta.type.should == "kinda.checkin"
80
- @meta.consumer_tag.should_not be_nil
81
- @meta.consumer_tag.should_not be_empty
82
- @meta.delivery_tag.should == 1
83
- @meta.reply_to.should == "a.sender"
84
- @meta.correlation_id.should == "r-1"
85
- @meta.message_id.should == "m-1"
86
- @meta.should_not be_redelivered
87
-
88
- @meta.app_id.should == "hotbunnies.tests"
89
- @meta.exchange.should == "amq.fanout"
90
-
91
- consumer.shut_down!
92
- end
93
- end
94
-
@@ -1,51 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Any channel" do
4
-
5
- #
6
- # Environment
7
- #
8
-
9
- let(:connection) { HotBunnies.connect }
10
- let(:channel) { connection.create_channel }
11
-
12
- after :each do
13
- channel.close
14
- connection.close
15
- end
16
-
17
- let(:latch) { java.util.concurrent.CountDownLatch.new(1) }
18
-
19
- class ConfirmationListener
20
- include com.rabbitmq.client.ConfirmListener
21
-
22
- def initialize(latch)
23
- @latch = latch
24
- end
25
-
26
- def handle_ack(delivery_tag, multiple)
27
- @latch.count_down
28
- end
29
-
30
- def handle_nack(delivery_tag, multiple)
31
- @latch.count_down
32
- end
33
- end
34
-
35
-
36
- #
37
- # Examples
38
- #
39
-
40
- it "can use publisher confirmations with listener objects" do
41
- channel.confirm_select
42
- channel.add_confirm_listener(ConfirmationListener.new(latch))
43
-
44
- queue = channel.queue("", :auto_delete => true)
45
- Thread.new do
46
- channel.default_exchange.publish("", :routing_key => queue.name)
47
- end
48
-
49
- latch.await
50
- end
51
- end
@@ -1,56 +0,0 @@
1
- require "spec_helper"
2
-
3
-
4
- describe "Any queue" do
5
-
6
- #
7
- # Environment
8
- #
9
-
10
- let(:connection) { HotBunnies.connect }
11
- let(:channel) { connection.create_channel }
12
-
13
- after :each do
14
- channel.close
15
- connection.close
16
- end
17
-
18
-
19
- #
20
- # Examples
21
- #
22
-
23
- it "can be bound to amq.fanout" do
24
- exchange = channel.exchange("amq.fanout", :type => :fanout, :durable => true, :auto_delete => false)
25
- queue = channel.queue("", :auto_delete => true)
26
- exchange.publish("")
27
- queue.get.should be_nil
28
-
29
- queue.bind(exchange)
30
-
31
- exchange.publish("", :routing_key => queue.name)
32
- queue.get.should_not be_nil
33
- end
34
-
35
-
36
- it "can be bound to a newly declared exchange" do
37
- exchange = channel.exchange("hot.bunnies.fanout", :type => :fanout, :durable => false, :auto_delete => true)
38
- queue = channel.queue("", :auto_delete => true)
39
- exchange.publish("")
40
- queue.get.should be_nil
41
-
42
- queue.bind(exchange)
43
-
44
- exchange.publish("", :routing_key => queue.name)
45
- queue.get.should_not be_nil
46
- end
47
-
48
-
49
- it "is automatically bound to the default exchange" do
50
- exchange = channel.default_exchange
51
- queue = channel.queue("", :auto_delete => true)
52
-
53
- exchange.publish("", :routing_key => queue.name)
54
- queue.get.should_not be_nil
55
- end
56
- end
@@ -1,44 +0,0 @@
1
- require "spec_helper"
2
-
3
-
4
- describe "Queue" do
5
- context "with a server-generated name" do
6
- let(:connection) { HotBunnies.connect }
7
- let(:channel) { connection.create_channel }
8
-
9
- after :each do
10
- channel.close
11
- connection.close
12
- end
13
-
14
- it "can be declared as auto-deleted" do
15
- channel.queue("", :auto_delete => true)
16
- end
17
-
18
- it "can be declared as auto-deleted and non-durable" do
19
- channel.queue("", :auto_delete => true, :durable => false)
20
- end
21
-
22
- it "can be declared as NON-auto-deleted" do
23
- channel.queue("", :auto_delete => false)
24
- end
25
-
26
- it "can be declared as NON-durable" do
27
- channel.queue("", :durable => false)
28
- end
29
-
30
- it "can be declared with additional attributes like x-message-ttle" do
31
- queue = channel.queue("", :durable => false, :arguments => { 'x-message-ttl' => 2000 })
32
- exchange = channel.exchange("", :type => :direct)
33
-
34
- 100.times do |i|
35
- exchange.publish("Message #{i}", :routing_key => queue.name)
36
- end
37
-
38
- queue.get.should_not be_nil
39
- sleep(2.1)
40
-
41
- queue.get.should be_nil
42
- end
43
- end
44
- end
@@ -1,23 +0,0 @@
1
- require "spec_helper"
2
-
3
-
4
- describe "Client-defined queue" do
5
-
6
- #
7
- # Environment
8
- #
9
-
10
- let(:connection) { HotBunnies.connect }
11
- let(:channel) { connection.create_channel }
12
-
13
- after :each do
14
- channel.close
15
- connection.close
16
- end
17
-
18
-
19
- it "can be deleted" do
20
- queue = channel.queue("", :auto_delete => true)
21
- queue.delete
22
- end
23
- end
@@ -1,38 +0,0 @@
1
- require "spec_helper"
2
-
3
-
4
- describe "Any queue" do
5
-
6
- #
7
- # Environment
8
- #
9
-
10
- let(:connection) { HotBunnies.connect }
11
- let(:channel) { connection.create_channel }
12
-
13
- after :each do
14
- channel.close
15
- connection.close
16
- end
17
-
18
-
19
- #
20
- # Examples
21
- #
22
-
23
- it "can be purged" do
24
- exchange = channel.exchange("amq.fanout", :type => :fanout, :durable => true, :auto_delete => false)
25
- queue = channel.queue("", :auto_delete => true)
26
- exchange.publish("")
27
- queue.get.should be_nil
28
- queue.purge
29
- queue.get.should be_nil
30
-
31
- queue.bind(exchange)
32
-
33
- exchange.publish("", :routing_key => queue.name)
34
- queue.get.should_not be_nil
35
- queue.purge
36
- queue.get.should be_nil
37
- end
38
- end
@@ -1,53 +0,0 @@
1
- require "spec_helper"
2
-
3
-
4
- describe "Any queue" do
5
-
6
- #
7
- # Environment
8
- #
9
-
10
- let(:connection) { HotBunnies.connect }
11
- let(:channel) { connection.create_channel }
12
-
13
- after :each do
14
- channel.close
15
- connection.close
16
- end
17
-
18
-
19
- #
20
- # Examples
21
- #
22
-
23
- it "can be unbound from amq.fanout" do
24
- exchange = channel.exchange("amq.fanout", :type => :fanout, :durable => true, :auto_delete => false)
25
- queue = channel.queue("", :auto_delete => true)
26
-
27
- queue.bind(exchange)
28
-
29
- exchange.publish("", :routing_key => queue.name)
30
- queue.get.should_not be_nil
31
-
32
- queue.unbind(exchange)
33
-
34
- exchange.publish("")
35
- queue.get.should be_nil
36
- end
37
-
38
-
39
- it "can be unbound from a client-declared exchange" do
40
- exchange = channel.exchange("hot.bunnies.fanout#{Time.now.to_i}", :type => :fanout, :durable => false)
41
- queue = channel.queue("", :auto_delete => true)
42
-
43
- queue.bind(exchange)
44
-
45
- exchange.publish("", :routing_key => queue.name)
46
- queue.get.should_not be_nil
47
-
48
- queue.unbind(exchange)
49
-
50
- exchange.publish("")
51
- queue.get.should be_nil
52
- end
53
- end
@@ -1,47 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Any AMQP 0.9.1 client using RabbitMQ" do
4
-
5
- #
6
- # Environment
7
- #
8
-
9
- let(:connection) { HotBunnies.connect }
10
- let(:channel) { connection.create_channel }
11
-
12
- after :each do
13
- channel.close
14
- connection.close
15
- end
16
-
17
-
18
- #
19
- # Examples
20
- #
21
-
22
- it "can have use CC and BCC headers for sender selected routing (a RabbitMQ-specific extension to AMQP 0.9.1)" do
23
- queue1 = channel.queue("", :auto_delete => true)
24
- queue2 = channel.queue("", :auto_delete => true)
25
- queue3 = channel.queue("", :auto_delete => true)
26
- queue4 = channel.queue("", :auto_delete => true)
27
-
28
- channel.default_exchange.publish("1010", :properties => {
29
- :headers => {
30
- "CC" => [queue2.name],
31
- "BCC" => [queue3.name]
32
- }
33
- }, :routing_key => queue1.name)
34
-
35
- sleep 1
36
-
37
- mc1, _ = queue1.status
38
- mc2, _ = queue2.status
39
- mc3, _ = queue3.status
40
- mc4, _ = queue4.status
41
-
42
- mc1.should == 1
43
- mc2.should == 1
44
- mc3.should == 1
45
- mc4.should == 0
46
- end
47
- end
data/spec/spec_helper.rb DELETED
@@ -1,18 +0,0 @@
1
- # encoding: utf-8
2
-
3
- $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
4
-
5
- require 'bundler'
6
- Bundler.setup(:default, :test)
7
-
8
- case RUBY_VERSION
9
- when "1.8.7" then
10
- class Array
11
- alias sample choice
12
- end
13
- end
14
-
15
-
16
- require "hot_bunnies"
17
-
18
- puts "Running on Ruby #{RUBY_VERSION}."