fleck 0.5.1 → 0.6.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 025ee667a52973215fb6c8fe25fa4e60d16298c7
4
- data.tar.gz: 0fff1a88508733c2913a889175b26c1f8623656d
3
+ metadata.gz: 3ed2d8327cd0b426a6b0cc46ea6cb419c9d13e7b
4
+ data.tar.gz: 35a37db895a6747cdd10b81727f71c6bbafe7ef1
5
5
  SHA512:
6
- metadata.gz: 0a2b7f2473088bfd62f9b2501e72e96847f0d01f07126bdea63c3ecd9b6409e0e49684ed0a8bcf802eb54acba49122de4203ee9c4ffdb6b991a5a562a6ac2556
7
- data.tar.gz: 19954ecda9a2e3b3d6d5ba2cc45e50ca5e98c4ff7184936b988a72523e403947b75c6e66b24995a585cae18f63cb71eab2ec880f694dfefb328ba7cb966729ea
6
+ metadata.gz: 6d29b40d7fc239bd4270953332af99b4274dbb164467c2ce02047bf3495bba035d8cf86f26c5e00fa253160d3378d9b27127c35fbc291005f41adb419580cb99
7
+ data.tar.gz: c70db6dbf8db14d47a937a87092b476e5acc54f812a587698841f38b0e1c7f92162107de715fc8a409377ffd7ad8105df82660371c4899fa2334c6d80801f783
data/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## develop ##
4
4
 
5
+ ## v0.6.0 (16 June 2016)
6
+ - **NEW** __(BREAKING CHANGE)__ Use `"fleck"` exchange for RPC simulation, so that reply queues could be used in a RabbitMQ Federation configuration.
7
+ Be careful when upgrading `Fleck::Consumer` from version `v0.5.x` or below, because now `Fleck::Consumer` will send responses to a `:direct` exchange
8
+ named `"fleck"`. If there're `Fleck::Clients` that are at version `v0.5.x` or below, they will not be able to receive the response from consumers of a
9
+ newer version.
10
+ - **NEW** Added a filter that prevents from using reserved `Fleck::Consumer` methods as actions.
11
+ - **NEW** Implemented the feature that allows to start consumer in a blocking way.
12
+ - **NEW** Added `:prefetch` and `:mandatory` options to `Fleck::Consumer` configuration options.
13
+
5
14
  ## v0.5.1 (20 April 2016)
6
15
  - **FIX** Don't expire requests with multiple responses if any response is received. Treat that kind of request as expired if no response has been received
7
16
  until the request expiration.
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'fleck'
5
+
6
+ user = ENV['USER'] || 'guest'
7
+ pass = ENV['PASS'] || 'guest'
8
+
9
+ CONCURRENCY = (ENV['CONCURRENCY'] || 2).to_i
10
+ SAMPLES = (ENV['SAMPLES'] || 10).to_i
11
+
12
+ Fleck.configure do |config|
13
+ config.default_user = user
14
+ config.default_pass = pass
15
+ config.loglevel = Logger::DEBUG
16
+ end
17
+
18
+ connection = Fleck.connection(host: "127.0.0.1", port: 5672, user: user, pass: pass, vhost: "/")
19
+ client = Fleck::Client.new(connection, "blocking.consumer.example.queue")
20
+
21
+ class MyConsumer < Fleck::Consumer
22
+ configure queue: 'blocking.consumer.example.queue', autostart: false
23
+ actions :quit
24
+
25
+ initialize do
26
+ @value = "MY CONSUMER :) #{self.object_id}"
27
+ end
28
+
29
+ def quit
30
+ logger.debug "Quit message received, but I'm goint to sleep for 2 seconds ..."
31
+ sleep 2
32
+ logger.debug "Let's terminate this example!"
33
+ terminate
34
+ end
35
+ end
36
+
37
+ client.request(action: 'quit', timeout: 5, async: true)
38
+
39
+ MyConsumer.start(block: true)
40
+
41
+ puts "We did it :)"
42
+ sleep 0.01 # Give some time to Bunny to cancel subscribtions and to close channels and connections
data/lib/fleck/client.rb CHANGED
@@ -15,9 +15,10 @@ module Fleck
15
15
  @mutex = Mutex.new
16
16
 
17
17
  @channel = @connection.create_channel
18
- @exchange = @channel.default_exchange
19
- @publisher = Bunny::Exchange.new(@channel, exchange_type, exchange_name)
18
+ @exchange = Bunny::Exchange.new(@channel, :direct, 'fleck')
19
+ @publisher = Bunny::Exchange.new(@connection.create_channel, exchange_type, exchange_name)
20
20
  @reply_queue = @channel.queue("", exclusive: true, auto_delete: true)
21
+ @reply_queue.bind(@exchange, routing_key: @reply_queue.name)
21
22
 
22
23
  handle_returned_messages!
23
24
  @concurrency.times { handle_responses! }
@@ -31,6 +31,7 @@ module Fleck
31
31
  end
32
32
 
33
33
  def self.register_action(action, method_name)
34
+ raise ArgumentError.new("Cannot use `:#{method_name}` method as an action, because it is reserved for Fleck::Consumer internal stuff!") if Fleck::Consumer.instance_methods.include?(method_name.to_s.to_sym)
34
35
  self.actions_map[action.to_s] = method_name.to_s
35
36
  end
36
37
 
@@ -38,9 +39,9 @@ module Fleck
38
39
  self.initialize_block = block
39
40
  end
40
41
 
41
- def self.start
42
+ def self.start(block: false)
42
43
  self.consumers.each do |consumer|
43
- consumer.start
44
+ consumer.start(block: block)
44
45
  end
45
46
  end
46
47
 
@@ -77,6 +78,8 @@ module Fleck
77
78
  @__consumer_tag = nil
78
79
  @__request = nil
79
80
  @__response = nil
81
+ @__lock = Mutex.new
82
+ @__lounger = ConditionVariable.new
80
83
 
81
84
  @__host = configs[:host]
82
85
  @__port = configs[:port]
@@ -87,6 +90,8 @@ module Fleck
87
90
  @__exchange_name = configs[:exchange_name] || ""
88
91
  @__queue_name = configs[:queue]
89
92
  @__autostart = configs[:autostart]
93
+ @__prefetch = (configs[:prefetch] || 100).to_i
94
+ @__mandatory = !!configs[:mandatory]
90
95
 
91
96
  if self.class.initialize_block
92
97
  self.instance_eval(&self.class.initialize_block)
@@ -101,10 +106,11 @@ module Fleck
101
106
  end
102
107
  end
103
108
 
104
- def start
109
+ def start(block: false)
105
110
  connect!
106
111
  create_channel!
107
112
  subscribe!
113
+ @__lock.synchronize{ @__lounger.wait(@__lock) } if block
108
114
  end
109
115
 
110
116
  def on_message(request, response)
@@ -117,6 +123,7 @@ module Fleck
117
123
  end
118
124
 
119
125
  def terminate
126
+ @__lock.synchronize { @__lounger.signal }
120
127
  pause
121
128
  unless channel.nil? || channel.closed?
122
129
  channel.close
@@ -202,8 +209,8 @@ module Fleck
202
209
 
203
210
  logger.debug "Creating a new channel for #{self.class.to_s.color(:yellow)} consumer"
204
211
  @__channel = @__connection.create_channel
205
- @__channel.prefetch(1) # prevent from dispatching a new RabbitMQ message, until the previous message is not processed
206
- @__publisher = @__channel.default_exchange
212
+ @__channel.prefetch(@__prefetch) # consume messages in batches
213
+ @__publisher = Bunny::Exchange.new(@__connection.create_channel, :direct, 'fleck')
207
214
  if @__exchange_type == :direct && @__exchange_name == ""
208
215
  @__queue = @__channel.queue(@__queue_name, auto_delete: false)
209
216
  else
@@ -243,7 +250,7 @@ module Fleck
243
250
  if @__channel.closed?
244
251
  logger.warn "Channel already closed! The response #{metadata.correlation_id} is going to be dropped."
245
252
  else
246
- @__publisher.publish(@__response.to_json, routing_key: metadata.reply_to, correlation_id: metadata.correlation_id, mandatory: true)
253
+ @__publisher.publish(@__response.to_json, routing_key: metadata.reply_to, correlation_id: metadata.correlation_id, mandatory: @__mandatory)
247
254
  @__channel.ack(delivery_info.delivery_tag)
248
255
  end
249
256
  end
data/lib/fleck/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fleck
2
- VERSION = "0.5.1"
2
+ VERSION = "0.6.0.rc1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fleck
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Groza Sergiu
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-04-20 00:00:00.000000000 Z
11
+ date: 2016-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -143,6 +143,7 @@ files:
143
143
  - bin/console
144
144
  - bin/setup
145
145
  - examples/actions.rb
146
+ - examples/blocking_consumer.rb
146
147
  - examples/consumer_initialization.rb
147
148
  - examples/deprecation.rb
148
149
  - examples/example.rb
@@ -176,12 +177,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
176
177
  version: '2.0'
177
178
  required_rubygems_version: !ruby/object:Gem::Requirement
178
179
  requirements:
179
- - - ">="
180
+ - - ">"
180
181
  - !ruby/object:Gem::Version
181
- version: '0'
182
+ version: 1.3.1
182
183
  requirements: []
183
184
  rubyforge_project:
184
- rubygems_version: 2.4.6
185
+ rubygems_version: 2.4.8
185
186
  signing_key:
186
187
  specification_version: 4
187
188
  summary: A Ruby gem for syncronous and asyncronous communication via Message Queue