hot_bunnies 1.4.0.pre2-java → 1.4.0.pre3-java
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.
- data/lib/hot_bunnies/queue.rb +44 -21
- data/lib/hot_bunnies/version.rb +1 -1
- metadata +2 -2
data/lib/hot_bunnies/queue.rb
CHANGED
@@ -59,6 +59,9 @@ module HotBunnies
|
|
59
59
|
end
|
60
60
|
|
61
61
|
class Subscription
|
62
|
+
import 'java.util.concurrent.TimeUnit'
|
63
|
+
import 'java.util.concurrent.atomic.AtomicBoolean'
|
64
|
+
|
62
65
|
attr_reader :channel, :queue_name, :consumer_tag
|
63
66
|
|
64
67
|
def initialize(channel, queue_name, options={})
|
@@ -66,17 +69,22 @@ module HotBunnies
|
|
66
69
|
@queue_name = queue_name
|
67
70
|
@ack = options.fetch(:ack, false)
|
68
71
|
|
69
|
-
@cancelled =
|
72
|
+
@cancelled = AtomicBoolean.new(false)
|
70
73
|
end
|
71
74
|
|
72
75
|
def each(options={}, &block)
|
73
76
|
raise 'The subscription already has a message listener' if @consumer
|
74
|
-
|
75
|
-
@consumer.start
|
77
|
+
start(create_consumer(options, block))
|
76
78
|
nil
|
77
79
|
end
|
78
80
|
alias_method :each_message, :each
|
79
81
|
|
82
|
+
def start(consumer)
|
83
|
+
@consumer = consumer
|
84
|
+
@consumer_tag = @channel.basic_consume(@queue_name, !@ack, @consumer)
|
85
|
+
@consumer.start
|
86
|
+
end
|
87
|
+
|
80
88
|
def cancel
|
81
89
|
raise 'Can\'t cancel: the subscriber haven\'t received an OK yet' if !self.active?
|
82
90
|
@consumer.cancel
|
@@ -110,12 +118,15 @@ module HotBunnies
|
|
110
118
|
def maybe_shutdown_executor
|
111
119
|
if @executor && @shut_down_executor
|
112
120
|
@executor.shutdown
|
121
|
+
unless @executor.await_termination(1, TimeUnit::SECONDS)
|
122
|
+
@executor.shutdown_now
|
123
|
+
end
|
113
124
|
end
|
114
125
|
end
|
115
126
|
|
116
|
-
def
|
127
|
+
def create_consumer(options, callback)
|
117
128
|
if options.fetch(:blocking, true)
|
118
|
-
|
129
|
+
BlockingCallbackConsumer.new(@channel, options[:buffer_size], callback)
|
119
130
|
else
|
120
131
|
if options[:executor]
|
121
132
|
@shut_down_executor = false
|
@@ -124,21 +135,14 @@ module HotBunnies
|
|
124
135
|
@shut_down_executor = true
|
125
136
|
@executor = java.util.concurrent.Executors.new_single_thread_executor
|
126
137
|
end
|
127
|
-
|
138
|
+
AsyncCallbackConsumer.new(@channel, callback, @executor)
|
128
139
|
end
|
129
|
-
@consumer_tag = @channel.basic_consume(@queue_name, !@ack, @consumer)
|
130
140
|
end
|
131
141
|
end
|
132
142
|
|
133
|
-
|
134
|
-
def initialize(channel, callback)
|
135
|
-
super(channel)
|
136
|
-
@callback = callback
|
137
|
-
@callback_arity = @callback.arity
|
138
|
-
@cancelled = false
|
139
|
-
@cancelling = false
|
140
|
-
end
|
143
|
+
public
|
141
144
|
|
145
|
+
class BaseConsumer < DefaultConsumer
|
142
146
|
def handleDelivery(consumer_tag, envelope, properties, body)
|
143
147
|
body = String.from_java_bytes(body)
|
144
148
|
headers = Headers.new(channel, consumer_tag, envelope, properties)
|
@@ -156,13 +160,25 @@ module HotBunnies
|
|
156
160
|
def start
|
157
161
|
end
|
158
162
|
|
163
|
+
def deliver(headers, message)
|
164
|
+
raise NotImplementedError, 'To be implemented by a subclass'
|
165
|
+
end
|
166
|
+
|
159
167
|
def cancel
|
160
168
|
channel.basic_cancel(consumer_tag)
|
161
169
|
@cancelling = true
|
162
170
|
end
|
171
|
+
end
|
163
172
|
|
164
|
-
|
165
|
-
|
173
|
+
private
|
174
|
+
|
175
|
+
class CallbackConsumer < BaseConsumer
|
176
|
+
def initialize(channel, callback)
|
177
|
+
super(channel)
|
178
|
+
@callback = callback
|
179
|
+
@callback_arity = @callback.arity
|
180
|
+
@cancelled = false
|
181
|
+
@cancelling = false
|
166
182
|
end
|
167
183
|
|
168
184
|
def callback(headers, message)
|
@@ -194,6 +210,7 @@ module HotBunnies
|
|
194
210
|
import 'java.util.concurrent.LinkedBlockingQueue'
|
195
211
|
import 'java.util.concurrent.ArrayBlockingQueue'
|
196
212
|
import 'java.util.concurrent.TimeUnit'
|
213
|
+
import 'java.lang.InterruptedException'
|
197
214
|
|
198
215
|
def initialize(channel, buffer_size, callback)
|
199
216
|
super(channel, callback)
|
@@ -206,8 +223,12 @@ module HotBunnies
|
|
206
223
|
|
207
224
|
def start
|
208
225
|
until @cancelled
|
209
|
-
|
210
|
-
|
226
|
+
begin
|
227
|
+
pair = @internal_queue.take
|
228
|
+
callback(*pair) if pair
|
229
|
+
rescue InterruptedException => e
|
230
|
+
# time to stop
|
231
|
+
end
|
211
232
|
end
|
212
233
|
while (pair = @internal_queue.poll)
|
213
234
|
callback(*pair)
|
@@ -218,8 +239,10 @@ module HotBunnies
|
|
218
239
|
if @cancelling || @cancelled
|
219
240
|
@internal_queue.offer(pair)
|
220
241
|
else
|
221
|
-
|
222
|
-
|
242
|
+
begin
|
243
|
+
@internal_queue.put(pair)
|
244
|
+
rescue InterruptedException => e
|
245
|
+
# time to stop
|
223
246
|
end
|
224
247
|
end
|
225
248
|
end
|
data/lib/hot_bunnies/version.rb
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: hot_bunnies
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: 6
|
5
|
-
version: 1.4.0.
|
5
|
+
version: 1.4.0.pre3
|
6
6
|
platform: java
|
7
7
|
authors:
|
8
8
|
- Theo Hultberg
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2012-06-
|
14
|
+
date: 2012-06-29 00:00:00 Z
|
15
15
|
dependencies: []
|
16
16
|
|
17
17
|
description: A object oriented interface to RabbitMQ that uses the Java driver under the hood
|