amqp 0.8.0.rc7 → 0.8.0.rc8

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,5 +1,6 @@
1
1
  = Version 0.8.0
2
2
 
3
+ * [WIP] AMQP::Utilities::EventLoopHelper detects app server (if any) being used and starts EventMachine reactor in an optimal way.
3
4
  * [FEATURE] AMQP 0.9.1 support, including tx.* operations class.
4
5
  * [API] Default authentication handler now raises AMQP::PossibleAuthenticationFailureError
5
6
  * [API] AMQP::Channel#initialize now takes 3rd (optional) options hash.
@@ -18,6 +18,6 @@ EventMachine.run do
18
18
  }
19
19
  end
20
20
 
21
- channel.direct("").publish "Hello, world!", :routing_key => queue.name
21
+ channel.direct("").publish "Hello, world!", :routing_key => "amqpgem.examples.helloworld"
22
22
  end
23
23
  end
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "bundler"
5
+ Bundler.setup
6
+
7
+ $:.unshift(File.expand_path("../../../lib", __FILE__))
8
+
9
+ require 'amqp'
10
+
11
+
12
+ AMQP.start do |session|
13
+ ch = AMQP::Channel.new(session)
14
+ exchange = ch.fanout("amq.fanout")
15
+ reply_exchange = ch.default_exchange
16
+
17
+ ch.queue("", :exclusive => true) do |q1|
18
+ q1.bind(exchange).subscribe do |header, payload|
19
+ v = rand
20
+
21
+ puts "Replying to #{header.message_id} with #{v}"
22
+ reply_exchange.publish(v, :routing_key => header.reply_to, :message_id => header.message_id)
23
+ end
24
+ end
25
+ ch.queue("", :exclusive => true) do |q2|
26
+ q2.bind(exchange).subscribe do |header, payload|
27
+ v = rand
28
+
29
+ puts "Replying to #{header.message_id} with #{v}"
30
+ reply_exchange.publish(v, :routing_key => header.reply_to, :message_id => header.message_id)
31
+ end
32
+ end
33
+ ch.queue("", :exclusive => true) do |q3|
34
+ q3.bind(exchange).subscribe do |header, payload|
35
+ v = rand
36
+
37
+ puts "Replying to #{header.message_id} with #{v}"
38
+ reply_exchange.publish(v, :routing_key => header.reply_to, :message_id => header.message_id)
39
+ end
40
+ end
41
+
42
+
43
+ requests = Hash.new
44
+
45
+ EventMachine.add_timer(0.5) do
46
+ ch.queue("", :exlusive => true) do |q|
47
+ q.subscribe do |header, payload|
48
+ requests[header.message_id].push(payload)
49
+
50
+ puts "Got a reply for #{header.message_id}"
51
+
52
+ if requests[header.message_id].size == 3
53
+ puts "Gathered all 3 responses: #{requests[header.message_id].join(', ')}"
54
+ requests[header.message_id].clear
55
+ end
56
+ end
57
+
58
+
59
+ message_id = "__message #{rand}__"
60
+ requests[message_id] = Array.new
61
+
62
+ exchange.publish("a request", :reply_to => q.name, :message_id => message_id)
63
+ end
64
+ end
65
+
66
+
67
+ EventMachine.add_timer(2) do
68
+ session.close { EventMachine.stop }
69
+ end
70
+ end
@@ -331,17 +331,21 @@ module AMQP
331
331
  unless name == "amq.#{type}" or name.empty? or opts[:no_declare]
332
332
  @status = :opening
333
333
 
334
- shim = Proc.new do |exchange, declare_ok|
335
- case block.arity
336
- when 1 then block.call(exchange)
337
- else
338
- block.call(exchange, declare_ok)
339
- end
340
- end
341
-
342
334
  unless @opts[:no_declare]
343
335
  @channel.once_open do
344
- self.declare(passive = @opts[:passive], durable = @opts[:durable], auto_delete = @opts[:auto_delete], nowait = @opts[:nowait], @opts[:arguments], &shim)
336
+ if block
337
+ shim = Proc.new do |exchange, declare_ok|
338
+ case block.arity
339
+ when 1 then block.call(exchange)
340
+ else
341
+ block.call(exchange, declare_ok)
342
+ end
343
+ end
344
+
345
+ self.declare(passive = @opts[:passive], durable = @opts[:durable], auto_delete = @opts[:auto_delete], nowait = @opts[:nowait], @opts[:arguments], &shim)
346
+ else
347
+ self.declare(passive = @opts[:passive], durable = @opts[:durable], auto_delete = @opts[:auto_delete], nowait = @opts[:nowait], @opts[:arguments])
348
+ end
345
349
  end
346
350
  end
347
351
  else
@@ -0,0 +1,48 @@
1
+ require "eventmachine"
2
+ require "amqp/utilities/server_type"
3
+
4
+ module AMQP
5
+ module Utilities
6
+ class EventLoopHelper
7
+
8
+ def self.eventmachine_thread
9
+ @eventmachine_thread
10
+ end # self.eventmachine_thread
11
+
12
+ def self.reactor_running?
13
+ EventMachine.reactor_running?
14
+ end # self.reactor_running?
15
+
16
+ def self.server_type
17
+ @server_type ||= ServerType.detect
18
+ end # self.server_type
19
+
20
+ def self.run(in_a_worker_process = false)
21
+ # TODO: make reentrant
22
+
23
+ @eventmachine_thread = case self.server_type
24
+ when :thin, :goliath, :evented_mongrel then
25
+ Thread.current
26
+ when :unicorn, :passenger then
27
+ EventMachine.stop if in_a_worker_process
28
+
29
+ t = Thread.new { EventMachine.run }
30
+ # give EventMachine reactor some time to start
31
+ sleep(0.25)
32
+
33
+ t
34
+ when :mongrel, :scgi, :webrick, nil then
35
+ t = Thread.new { EventMachine.run }
36
+ # give EventMachine reactor some time to start
37
+ sleep(0.25)
38
+
39
+ t
40
+ end
41
+ end # self.run
42
+
43
+ def self.stop
44
+ EventMachine.stop
45
+ end
46
+ end # EventLoopHelper
47
+ end # Utilities
48
+ end # AMQP
@@ -0,0 +1,50 @@
1
+ # Original version is from Qusion project by Daniel DeLeo.
2
+ #
3
+ # Copyright (c) 2009 Daniel DeLeo
4
+ # Copyright (c) 2011 Michael Klishin
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ # THE SOFTWARE.
23
+
24
+ module AMQP
25
+ module Utilities
26
+ class ServerType
27
+ def self.detect
28
+ if defined?(::PhusionPassenger)
29
+ :passenger
30
+ elsif defined?(::Unicorn)
31
+ :unicorn
32
+ elsif defined?(::Thin)
33
+ :thin
34
+ elsif defined?(::Goliath)
35
+ :goliath
36
+ elsif defined?(::Mongrel) && defined?(::Mongrel::MongrelProtocol)
37
+ :evented_mongrel
38
+ elsif defined?(::Mongrel)
39
+ :mongrel
40
+ elsif defined?(::SCGI)
41
+ :scgi
42
+ elsif defined?(::WEBrick)
43
+ :webrick
44
+ else
45
+ nil
46
+ end # if
47
+ end # self.detect
48
+ end # ServerType
49
+ end # Utilities
50
+ end # AMQP
@@ -6,5 +6,5 @@ module AMQP
6
6
  #
7
7
  # @see AMQ::Protocol::VERSION
8
8
  # @return [String] AMQP gem version
9
- VERSION = '0.8.0.rc7'
9
+ VERSION = '0.8.0.rc8'
10
10
  end
metadata CHANGED
@@ -1,49 +1,65 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: amqp
3
- version: !ruby/object:Gem::Version
4
- version: 0.8.0.rc7
5
- prerelease: 6
3
+ version: !ruby/object:Gem::Version
4
+ hash: 977940489
5
+ prerelease: true
6
+ segments:
7
+ - 0
8
+ - 8
9
+ - 0
10
+ - rc8
11
+ version: 0.8.0.rc8
6
12
  platform: ruby
7
- authors:
13
+ authors:
8
14
  - Aman Gupta
9
15
  - Jakub Stastny aka botanicus
10
16
  - Michael S. Klishin
11
17
  autorequire:
12
18
  bindir: bin
13
19
  cert_chain:
14
- date: 2011-05-06 00:00:00.000000000 +04:00
20
+ date: 2011-05-09 00:00:00 +04:00
15
21
  default_executable:
16
- dependencies:
17
- - !ruby/object:Gem::Dependency
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
18
24
  name: eventmachine
19
- requirement: &2156551420 !ruby/object:Gem::Requirement
25
+ prerelease: false
26
+ requirement: &id001 !ruby/object:Gem::Requirement
20
27
  none: false
21
- requirements:
22
- - - ! '>='
23
- - !ruby/object:Gem::Version
24
- version: '0'
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ hash: 3
32
+ segments:
33
+ - 0
34
+ version: "0"
25
35
  type: :runtime
26
- prerelease: false
27
- version_requirements: *2156551420
28
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
29
38
  name: amq-client
30
- requirement: &2156550900 !ruby/object:Gem::Requirement
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
31
41
  none: false
32
- requirements:
33
- - - ! '>='
34
- - !ruby/object:Gem::Version
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 1369095468
46
+ segments:
47
+ - 0
48
+ - 7
49
+ - 0
50
+ - alpha20
35
51
  version: 0.7.0.alpha20
36
52
  type: :runtime
37
- prerelease: false
38
- version_requirements: *2156550900
39
- description: Widely used, feature-rich asynchronous AMQP 0.9.1 client with batteries
40
- included
41
- email:
53
+ version_requirements: *id002
54
+ description: Widely used, feature-rich asynchronous AMQP 0.9.1 client with batteries included
55
+ email:
42
56
  - michael@novemberain.com
43
57
  - stastny@101ideas.cz
44
58
  executables: []
59
+
45
60
  extensions: []
46
- extra_rdoc_files:
61
+
62
+ extra_rdoc_files:
47
63
  - README.textile
48
64
  - docs/08Migration.textile
49
65
  - docs/Bindings.textile
@@ -59,7 +75,7 @@ extra_rdoc_files:
59
75
  - docs/RabbitMQVersions.textile
60
76
  - docs/Routing.textile
61
77
  - docs/VendorSpecificExtensions.textile
62
- files:
78
+ files:
63
79
  - .gitignore
64
80
  - .rspec
65
81
  - .travis.yml
@@ -129,6 +145,7 @@ files:
129
145
  - examples/legacy/primes.rb
130
146
  - examples/legacy/stocks.rb
131
147
  - examples/publishing/publishing_and_immediately_stopping_event_loop.rb
148
+ - examples/publishing/simplistic_scatter_gather.rb
132
149
  - examples/queues/automatic_binding_for_default_direct_exchange.rb
133
150
  - examples/queues/basic_get.rb
134
151
  - examples/queues/declare_a_queue_without_assignment.rb
@@ -177,6 +194,8 @@ files:
177
194
  - lib/amqp/queue.rb
178
195
  - lib/amqp/rpc.rb
179
196
  - lib/amqp/session.rb
197
+ - lib/amqp/utilities/event_loop_helper.rb
198
+ - lib/amqp/utilities/server_type.rb
180
199
  - lib/amqp/version.rb
181
200
  - lib/mq.rb
182
201
  - lib/mq/logger.rb
@@ -204,68 +223,38 @@ files:
204
223
  has_rdoc: true
205
224
  homepage: http://github.com/ruby-amqp/amqp
206
225
  licenses: []
207
- post_install_message: ! "[\e[32mVersion 0.8.0\e[0m] [FEATURE] AMQP 0.9.1 support,
208
- including tx.* operations class.\n[\e[32mVersion 0.8.0\e[0m] [API] Default authentication
209
- handler now raises AMQP::PossibleAuthenticationFailureError\n[\e[32mVersion 0.8.0\e[0m]
210
- [API] AMQP::Channel#initialize now takes 3rd (optional) options hash.\n[\e[32mVersion
211
- 0.8.0\e[0m] [API] Broker connection class is now AMQP::Session.\n[\e[32mVersion
212
- 0.8.0\e[0m] [API] AMQP::Error instance now may carry cause, an exception that caused
213
- exception in question to be raised.\n[\e[32mVersion 0.8.0\e[0m] [API] When initial
214
- TCP connection fails, default action is now to raise AMQP::TCPConnectionFailed.\n[\e[32mVersion
215
- 0.8.0\e[0m] [API] AMQP::BasicClient#reconnect now takes 2nd optional argument, period
216
- of waiting in seconds.\n[\e[32mVersion 0.8.0\e[0m] [FEATURE] Handlers for initial
217
- connection failure, connection loss; channel-level exceptions handlers on Channel
218
- instances.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Exchange#initialize now accepts
219
- :arguments option that takes a hash.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#initialize
220
- now accepts :arguments option that takes a hash.\n[\e[32mVersion 0.8.0\e[0m] [API]
221
- AMQP#Logger is deprecated. It will be removed before 1.0 release.\n[\e[32mVersion
222
- 0.8.0\e[0m] [API] AMQP#fork is deprecated. It will be removed before 1.0 release.\n[\e[32mVersion
223
- 0.8.0\e[0m] [API] AMQP::RPC is deprecated. It will be removed before 1.0 release.\n[\e[32mVersion
224
- 0.8.0\e[0m] [FEATURE] Significant improvements to the documentation. From now on
225
- lack of/poor documentation is considered a severe bug.\n[\e[32mVersion 0.8.0\e[0m]
226
- [FEATURE] Support for RabbitMQ extensions to AMQP 0.9.1\n[\e[32mVersion 0.8.0\e[0m]
227
- [API] AMQP::Exchange#publish now accepts (an optional) callback.\n[\e[32mVersion
228
- 0.8.0\e[0m] [API] AMQP::Channel.new now accepts (an optional) callback.\n[\e[32mVersion
229
- 0.8.0\e[0m] [API] AMQP::Header#ack now can acknowledge multiple deliveries\n[\e[32mVersion
230
- 0.8.0\e[0m] [API] AMQP::Exchange#delete now takes (an optional) block that is called
231
- when exchange.delete-ok response arrives.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Header
232
- now implements #to_hash\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#pop block
233
- now can take 1, 2 or 3 arguments.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#purge
234
- \ now takes an optional block which is called when queue.purge-ok response arrives.\n[\e[32mVersion
235
- 0.8.0\e[0m] [API] AMQP::Queue#delete now takes an optional block which is called
236
- when queue.delete-ok response arrives.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#delete
237
- now accepts :nowait option.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#unbind
238
- now takes an optional block which is called when queue.unbind-ok response arrives.\n[\e[32mVersion
239
- 0.8.0\e[0m] [API] AMQP::Queue#unbind now accepts :routing_key as alias to :key.
240
- we believe it is a good idea to use AMQP terms.\n[\e[32mVersion 0.8.0\e[0m] [API]
241
- AMQP::Channel#prefetch now takes (an optional) 2nd parameter that specifies that
242
- QoS settings should be applied to underlying connection, as well as optional callback.\n[\e[32mVersion
243
- 0.8.0\e[0m] [API] AMQP::Channel#recover now takes (an optional) callback that is
244
- called when basic.recover-ok is received.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Frame
245
- is gone.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Buffer is gone. Serialization &
246
- framing are now handled primarily by amq-protocol.\n[\e[32mVersion 0.8.0\e[0m] [API]
247
- AMQP::Queue#publish is deprecated.\n[\e[32mVersion 0.8.0\e[0m] [API] Name argument
248
- for AMQP::Queue.new and Channel#queue is optional.\n"
249
- rdoc_options:
226
+
227
+ post_install_message:
228
+ rdoc_options:
250
229
  - --include=examples --main README.textile
251
- require_paths:
230
+ require_paths:
252
231
  - lib
253
- required_ruby_version: !ruby/object:Gem::Requirement
232
+ required_ruby_version: !ruby/object:Gem::Requirement
254
233
  none: false
255
- requirements:
256
- - - ! '>='
257
- - !ruby/object:Gem::Version
258
- version: '0'
259
- required_rubygems_version: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ hash: 3
238
+ segments:
239
+ - 0
240
+ version: "0"
241
+ required_rubygems_version: !ruby/object:Gem::Requirement
260
242
  none: false
261
- requirements:
262
- - - ! '>'
263
- - !ruby/object:Gem::Version
243
+ requirements:
244
+ - - ">"
245
+ - !ruby/object:Gem::Version
246
+ hash: 25
247
+ segments:
248
+ - 1
249
+ - 3
250
+ - 1
264
251
  version: 1.3.1
265
252
  requirements: []
253
+
266
254
  rubyforge_project: amqp
267
- rubygems_version: 1.6.2
255
+ rubygems_version: 1.3.7
268
256
  signing_key:
269
257
  specification_version: 3
270
258
  summary: AMQP client implementation in Ruby/EventMachine.
271
259
  test_files: []
260
+