rservicebus 0.0.18 → 0.0.21

Sign up to get free protection for your applications and to get access to all the features.
data/lib/rservicebus.rb CHANGED
@@ -1,15 +1,19 @@
1
+ #Add the currently running directory to the start of the load path
2
+ #$:.unshift File.dirname(__FILE__) + '/../../lib'
3
+
1
4
  require "rubygems"
2
- require 'beanstalk-client'
3
5
  require "yaml"
4
6
  require "uuidtools"
5
7
  require "redis"
6
8
  require "json"
7
9
 
8
10
  require "rservicebus/helper_functions"
9
- require "rservicebus/Agent"
11
+ require "rservicebus/Agent/Beanstalk"
12
+ require "rservicebus/Agent/Bunny"
10
13
  require "rservicebus/ErrorMessage"
11
14
  require "rservicebus/HandlerLoader"
12
15
  require "rservicebus/ConfigureAppResource"
16
+ require "rservicebus/ConfigureMQ"
13
17
  require "rservicebus/Host"
14
18
  require "rservicebus/Config"
15
19
  require "rservicebus/Stats"
@@ -3,7 +3,7 @@ require 'beanstalk-client'
3
3
 
4
4
  #A means for a stand-alone process to interact with the bus, without being a full
5
5
  #rservicebus application
6
- class Agent
6
+ class Agent_Beanstalk
7
7
  @beanstalk
8
8
 
9
9
  def initialize(url=['localhost:11300'])
@@ -0,0 +1,49 @@
1
+ module RServiceBus
2
+ require 'bunny'
3
+
4
+ #A means for a stand-alone process to interact with the bus, without being a full
5
+ #rservicebus application
6
+ class Agent_Bunny
7
+ @bunny
8
+
9
+ def initialize(host='localhost')
10
+ @bunny = Bunny.new(:host=>host)
11
+ @bunny.start
12
+ @direct_exchange = @bunny.exchange('rservicebus.agent')
13
+ end
14
+
15
+ # Put a msg on the bus
16
+ #
17
+ # @param [Object] messageObj The msg to be sent
18
+ # @param [String] queueName the name of the queue to be send the msg to
19
+ # @param [String] returnAddress the name of a queue to send replies to
20
+ def sendMsg(messageObj, queueName, returnAddress=nil)
21
+ msg = RServiceBus::Message.new( messageObj, returnAddress )
22
+ serialized_object = YAML::dump(msg)
23
+
24
+
25
+ q = @bunny.queue(queueName)
26
+ q.bind(@direct_exchange)
27
+ #q.publish( serialized_object )
28
+
29
+ @direct_exchange.publish(serialized_object)
30
+ end
31
+
32
+ # Gives an agent a mean to receive replies
33
+ #
34
+ # @param [String] queueName the name of the queue to monitor for messages
35
+ def checkForReply( queueName )
36
+ q = @bunny.queue(queueName)
37
+
38
+ loop = true
39
+ while loop do
40
+ msg = q.pop[:payload]
41
+ loop = ( msg == :queue_empty )
42
+ end
43
+
44
+ @msg = YAML::load(msg)
45
+ return @msg.msg
46
+ end
47
+ end
48
+
49
+ end
@@ -2,7 +2,7 @@ module RServiceBus
2
2
 
3
3
  #Marshals configuration information for an rservicebus host
4
4
  class Config
5
- attr_reader :appName, :messageEndpointMappings, :handlerPathList, :localQueueName, :errorQueueName, :maxRetries, :forwardReceivedMessagesTo, :verbose, :beanstalkHost, :queueTimeout, :statOutputCountdown, :contractList, :libList, :auditQueueName
5
+ attr_reader :appName, :messageEndpointMappings, :handlerPathList, :localQueueName, :errorQueueName, :maxRetries, :forwardReceivedMessagesTo, :verbose, :queueTimeout, :statOutputCountdown, :contractList, :libList, :auditQueueName, :mqHost
6
6
 
7
7
  @appName
8
8
  @messageEndpointMappings
@@ -17,7 +17,7 @@ class Config
17
17
 
18
18
  @verbose
19
19
 
20
- @beanstalkHost
20
+ @mq
21
21
 
22
22
  @queueTimeout
23
23
 
@@ -163,9 +163,8 @@ class Config
163
163
  return self
164
164
  end
165
165
 
166
- def configureBeanstalk
167
- @beanstalkHost = self.getValue( "BEANSTALK", "localhost:11300" )
168
-
166
+ def configureMq
167
+ @mqHost = self.getValue( "MQ", "beanstalk://localhost" )
169
168
  return self
170
169
  end
171
170
 
@@ -0,0 +1,29 @@
1
+ module RServiceBus
2
+
3
+ require "uri"
4
+
5
+ #Configure AppResources for an rservicebus host
6
+ class ConfigureMQ
7
+
8
+ def get( string, timeout )
9
+
10
+ uri = URI.parse( string )
11
+ case uri.scheme
12
+ when "beanstalk"
13
+ require "rservicebus/MQ/Beanstalk"
14
+ mq = MQ_Beanstalk.new( uri, timeout )
15
+
16
+ when "bunny"
17
+ require "rservicebus/MQ/Bunny"
18
+ mq = MQ_Bunny.new( uri, timeout )
19
+
20
+ else
21
+ abort("Scheme, #{uri.scheme}, not recognised when configuring mq, #{string}");
22
+ end
23
+
24
+ return mq
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -1,5 +1,9 @@
1
1
  module RServiceBus
2
2
 
3
+
4
+ class NoMsgToProcess<StandardError
5
+ end
6
+
3
7
  #Host process for rservicebus
4
8
  class Host
5
9
 
@@ -10,7 +14,7 @@ module RServiceBus
10
14
 
11
15
  @subscriptions
12
16
 
13
- @beanstalk
17
+ @mq
14
18
 
15
19
  @appResources
16
20
 
@@ -33,21 +37,8 @@ module RServiceBus
33
37
  return self;
34
38
  end
35
39
 
36
- def connectToBeanstalk
37
- begin
38
- @beanstalk = Beanstalk::Pool.new([@config.beanstalkHost])
39
- rescue Exception => e
40
- puts "Error connecting to Beanstalk"
41
- puts "Host string, #{@config.beanstalkHost}"
42
- if e.message == "Beanstalk::NotConnected" then
43
- puts "***Most likely, beanstalk is not running. Start beanstalk, and try running this again."
44
- puts "***If you still get this error, check beanstalk is running at, " + @config.beanstalkHost
45
- else
46
- puts e.message
47
- puts e.backtrace
48
- end
49
- abort()
50
- end
40
+ def connectToMq
41
+ @mq = ConfigureMQ.new.get( @config.mqHost + "/" + @config.localQueueName, @config.queueTimeout )
51
42
 
52
43
  return self
53
44
  end
@@ -82,7 +73,6 @@ module RServiceBus
82
73
  return self
83
74
  end
84
75
 
85
-
86
76
  def loadContracts()
87
77
  log "Load Contracts"
88
78
 
@@ -122,13 +112,12 @@ module RServiceBus
122
112
  return self
123
113
  end
124
114
 
125
-
126
115
  def initialize()
127
116
 
128
117
  @config = ConfigFromEnv.new
129
118
  .configureLogging()
130
119
  .loadHostSection()
131
- .configureBeanstalk()
120
+ .configureMq()
132
121
  .loadContracts()
133
122
  .loadMessageEndpointMappings()
134
123
  .loadHandlerPathList()
@@ -137,7 +126,7 @@ module RServiceBus
137
126
 
138
127
  self.configureStatistics()
139
128
  .configureAppResource()
140
- .connectToBeanstalk()
129
+ .connectToMq()
141
130
  .loadHandlers()
142
131
  .loadContracts()
143
132
  .loadLibs()
@@ -151,7 +140,6 @@ module RServiceBus
151
140
  log "Starting the Host"
152
141
 
153
142
  log "Watching, " + @config.localQueueName
154
- @beanstalk.watch( @config.localQueueName )
155
143
  if !@config.forwardReceivedMessagesTo.nil? then
156
144
  log "Forwarding all received messages to: " + @config.forwardReceivedMessagesTo.to_s
157
145
  end
@@ -165,20 +153,19 @@ module RServiceBus
165
153
  log "Waiting for messages. To exit press CTRL+C"
166
154
  statOutputCountdown = 0
167
155
  messageLoop = true
168
-
156
+
169
157
  while messageLoop do
170
158
  retries = @config.maxRetries
171
159
  #Popping a msg off the queue should not be in the message handler, as it affects retry
172
160
  begin
173
161
  if statOutputCountdown == 0 then
174
- log @stats.getForReporting
162
+ # log @stats.getForReporting
175
163
  statOutputCountdown = @config.statOutputCountdown-1
176
164
  else
177
165
  statOutputCountdown = statOutputCountdown - 1
178
166
  end
179
- job = @beanstalk.reserve @config.queueTimeout
167
+ body = @mq.pop
180
168
  begin
181
- body = job.body
182
169
  @stats.incTotalProcessed
183
170
  @msg = YAML::load(body)
184
171
  if @msg.msg.class.name == "RServiceBus::Message_Subscription" then
@@ -190,10 +177,12 @@ module RServiceBus
190
177
  self._SendAlreadyWrappedAndSerialised(body,@config.forwardReceivedMessagesTo)
191
178
  end
192
179
  end
193
- job.delete
180
+ @mq.ack
194
181
  rescue Exception => e
195
182
  sleep 0.5
196
-
183
+
184
+ puts e.message
185
+ puts e.backtrace
197
186
 
198
187
  @handlerList[@msg.msg.class.name].each do |handler|
199
188
  @resourceByHandlerNameList[handler.class.name].each do |resource|
@@ -223,140 +212,141 @@ module RServiceBus
223
212
  @msg.addErrorMsg( @config.localQueueName, errorString )
224
213
  serialized_object = YAML::dump(@msg)
225
214
  self._SendAlreadyWrappedAndSerialised(serialized_object, @config.errorQueueName)
226
- job.delete
215
+ @mq.ack
227
216
  end
228
217
  rescue SystemExit, Interrupt
229
218
  puts "Exiting on request ..."
230
219
  messageLoop = false
220
+
221
+ rescue NoMsgToProcess => e
222
+ #This exception is just saying there are no messages to process
223
+ statOutputCountdown = 0
231
224
  rescue Exception => e
232
- if e.message == "TIMED_OUT" then
233
- #This exception is just saying there are no messages to process
234
- statOutputCountdown = 0
235
- elsif e.message == "SIGTERM" then
236
- puts "Exiting on request ..."
237
- messageLoop = false
238
- else
239
- puts "*** This is really unexpected."
240
- messageLoop = false
241
- puts "Message: " + e.message
242
- puts e.backtrace
243
- end
225
+ if e.message == "SIGTERM" then
226
+ puts "Exiting on request ..."
227
+ messageLoop = false
228
+ else
229
+ puts "*** This is really unexpected."
230
+ messageLoop = false
231
+ puts "Message: " + e.message
232
+ puts e.backtrace
244
233
  end
245
234
  end
246
235
  end
236
+ end
237
+
238
+ #Send the current msg to the appropriate handlers
239
+ def HandleMessage()
240
+ msgName = @msg.msg.class.name
241
+ handlerList = @handlerList[msgName]
247
242
 
248
- #Send the current msg to the appropriate handlers
249
- def HandleMessage()
250
- msgName = @msg.msg.class.name
251
- handlerList = @handlerList[msgName]
252
-
253
- if handlerList == nil then
254
- log "No handler found for: " + msgName
255
- raise "No Handler Found"
256
- else
257
- log "Handler found for: " + msgName, true
258
- handlerList.each do |handler|
259
- begin
260
- handler.Handle( @msg.msg )
261
- rescue Exception => e
262
- log "An error occured in Handler: " + handler.class.name
263
- log e.message + ". " + e.backtrace[0]
264
- raise e
265
- end
243
+ if handlerList == nil then
244
+ log "No handler found for: " + msgName
245
+ puts "No handler found for: " + msgName
246
+ puts YAML::dump(@msg)
247
+ raise "No Handler Found"
248
+ else
249
+ log "Handler found for: " + msgName, true
250
+ handlerList.each do |handler|
251
+ begin
252
+ handler.Handle( @msg.msg )
253
+ rescue Exception => e
254
+ log "An error occured in Handler: " + handler.class.name
255
+ log e.message + ". " + e.backtrace[0]
256
+ raise e
266
257
  end
267
258
  end
268
259
  end
260
+ end
261
+
262
+ #Sends a msg across the bus
263
+ #
264
+ # @param [String] serialized_object serialized RServiceBus::Message
265
+ # @param [String] queueName endpoint to which the msg will be sent
266
+ def _SendAlreadyWrappedAndSerialised( serialized_object, queueName )
267
+ log "Bus._SendAlreadyWrappedAndSerialised", true
269
268
 
270
- #Sends a msg across the bus
271
- #
272
- # @param [String] serialized_object serialized RServiceBus::Message
273
- # @param [String] queueName endpoint to which the msg will be sent
274
- def _SendAlreadyWrappedAndSerialised( serialized_object, queueName )
275
- log "Bus._SendAlreadyWrappedAndSerialised", true
276
-
277
- if !@config.auditQueueName.nil? then
278
- @beanstalk.use( @config.auditQueueName )
279
- @beanstalk.put( serialized_object )
280
- end
281
-
282
- @beanstalk.use( queueName )
283
- @beanstalk.put( serialized_object )
269
+ if !@config.auditQueueName.nil? then
270
+ @mq.send( @config.auditQueueName, serialized_object )
284
271
  end
285
272
 
286
- #Sends a msg across the bus
287
- #
288
- # @param [RServiceBus::Message] msg msg to be sent
289
- # @param [String] queueName endpoint to which the msg will be sent
290
- def _SendNeedsWrapping( msg, queueName )
291
- log "Bus._SendNeedsWrapping", true
292
-
293
- rMsg = RServiceBus::Message.new( msg, @config.localQueueName )
294
- serialized_object = YAML::dump(rMsg)
295
- log "Sending: " + msg.class.name + " to: " + queueName, true
296
- self._SendAlreadyWrappedAndSerialised( serialized_object, queueName )
297
- end
273
+ @mq.send( queueName, serialized_object )
274
+ end
275
+
276
+ #Sends a msg across the bus
277
+ #
278
+ # @param [RServiceBus::Message] msg msg to be sent
279
+ # @param [String] queueName endpoint to which the msg will be sent
280
+ def _SendNeedsWrapping( msg, queueName )
281
+ log "Bus._SendNeedsWrapping", true
298
282
 
299
- #Sends a msg back across the bus
300
- #Reply queues are specified in each msg. It works like
301
- #email, where the reply address can actually be anywhere
302
- #
303
- # @param [RServiceBus::Message] msg msg to be sent
304
- def Reply( msg )
305
- log "Reply with: " + msg.class.name + " To: " + @msg.returnAddress, true
306
- @stats.incTotalReply
307
-
308
- self._SendNeedsWrapping( msg, @msg.returnAddress )
309
- end
283
+ rMsg = RServiceBus::Message.new( msg, @config.localQueueName )
284
+ serialized_object = YAML::dump(rMsg)
285
+ log "Sending: " + msg.class.name + " to: " + queueName, true
286
+ self._SendAlreadyWrappedAndSerialised( serialized_object, queueName )
287
+ end
288
+
289
+ #Sends a msg back across the bus
290
+ #Reply queues are specified in each msg. It works like
291
+ #email, where the reply address can actually be anywhere
292
+ #
293
+ # @param [RServiceBus::Message] msg msg to be sent
294
+ def Reply( msg )
295
+ log "Reply with: " + msg.class.name + " To: " + @msg.returnAddress, true
296
+ @stats.incTotalReply
310
297
 
298
+ self._SendNeedsWrapping( msg, @msg.returnAddress )
299
+ end
300
+
301
+
302
+ #Send a msg across the bus
303
+ #msg destination is specified at the infrastructure level
304
+ #
305
+ # @param [RServiceBus::Message] msg msg to be sent
306
+ def Send( msg )
307
+ log "Bus.Send", true
308
+ @stats.incTotalSent
311
309
 
312
- #Send a msg across the bus
313
- #msg destination is specified at the infrastructure level
314
- #
315
- # @param [RServiceBus::Message] msg msg to be sent
316
- def Send( msg )
317
- log "Bus.Send", true
318
- @stats.incTotalSent
319
-
320
- msgName = msg.class.name
321
- if !@config.messageEndpointMappings.has_key?( msgName ) then
322
- log "No end point mapping found for: " + msgName
323
- log "**** Check in RServiceBus.yml that the section MessageEndpointMappings contains an entry named : " + msgName
324
- raise "No end point mapping found for: " + msgName
325
- end
326
-
327
- queueName = @config.messageEndpointMappings[msgName]
328
-
329
- self._SendNeedsWrapping( msg, queueName )
310
+ msgName = msg.class.name
311
+ if !@config.messageEndpointMappings.has_key?( msgName ) then
312
+ log "No end point mapping found for: " + msgName
313
+ log "**** Check in RServiceBus.yml that the section MessageEndpointMappings contains an entry named : " + msgName
314
+ raise "No end point mapping found for: " + msgName
330
315
  end
331
316
 
332
- #Sends an event to all subscribers across the bus
333
- #
334
- # @param [RServiceBus::Message] msg msg to be sent
335
- def Publish( msg )
336
- log "Bus.Publish", true
337
- @stats.incTotalPublished
338
-
339
- subscriptions = @subscriptionManager.get(msg.class.name)
340
- subscriptions.each do |subscriber|
341
- self._SendNeedsWrapping( msg, subscriber )
342
- end
343
-
344
- end
317
+ queueName = @config.messageEndpointMappings[msgName]
318
+
319
+ self._SendNeedsWrapping( msg, queueName )
320
+ end
321
+
322
+ #Sends an event to all subscribers across the bus
323
+ #
324
+ # @param [RServiceBus::Message] msg msg to be sent
325
+ def Publish( msg )
326
+ log "Bus.Publish", true
327
+ @stats.incTotalPublished
345
328
 
346
- #Sends a subscription request across the Bus
347
- #
348
- # @param [String] eventName event to be subscribes to
349
- def Subscribe( eventName )
350
- log "Bus.Subscribe: " + eventName, true
351
-
352
-
353
- queueName = @config.messageEndpointMappings[eventName]
354
- subscription = Message_Subscription.new( eventName )
355
-
356
-
357
- self._SendNeedsWrapping( subscription, queueName )
329
+ subscriptions = @subscriptionManager.get(msg.class.name)
330
+ subscriptions.each do |subscriber|
331
+ self._SendNeedsWrapping( msg, subscriber )
358
332
  end
359
333
 
360
334
  end
361
335
 
336
+ #Sends a subscription request across the Bus
337
+ #
338
+ # @param [String] eventName event to be subscribes to
339
+ def Subscribe( eventName )
340
+ log "Bus.Subscribe: " + eventName, true
341
+
342
+
343
+ queueName = @config.messageEndpointMappings[eventName]
344
+ subscription = Message_Subscription.new( eventName )
345
+
346
+
347
+ self._SendNeedsWrapping( subscription, queueName )
348
+ end
349
+
362
350
  end
351
+
352
+ end
@@ -0,0 +1,73 @@
1
+ module RServiceBus
2
+
3
+ require "uri"
4
+
5
+ # Wrapper base class for Queue implementations available to the applications, allowing rservicebus to instatiate and configure
6
+ # queue implementations at startup
7
+ # - dependency injection.
8
+ #
9
+ class MQ
10
+ @uri
11
+
12
+ # Resources are attached resources, and can be specified using the URI syntax.
13
+ #
14
+ # @param [URI] uri the type and location of queue, eg bunny://127.0.0.1/foo
15
+ # @param [Integer] timeout the amount of time to wait for a msg to arrive
16
+ def initialize( uri, timeout )
17
+ @timeout = timeout
18
+ if uri.is_a? URI then
19
+ @uri = uri
20
+ else
21
+ puts "uri must be a valid URI"
22
+ abort()
23
+ end
24
+
25
+ host = uri.host
26
+ port = uri.port
27
+ queue = uri.path.sub( "/", "" )
28
+
29
+ if ( queue == "" )
30
+ puts "Queue name must be supplied "
31
+ puts "*** uri, #{uri}, needs to contain a queue name"
32
+ puts "*** the structure is scheme://host[:port]/queuename"
33
+ abort()
34
+ end
35
+
36
+ self.connect(uri.host, uri.port)
37
+ self.subscribe( queue )
38
+ end
39
+
40
+ # Connect to the broker
41
+ #
42
+ def connect( host, port )
43
+ raise "Method, connect, needs to be implemented"
44
+ end
45
+
46
+ # Connect to the queue
47
+ #
48
+ def subscribe( queuename )
49
+ raise "Method, subscribe, needs to be implemented"
50
+ end
51
+
52
+ # Get next msg from queue
53
+ def pop
54
+ raise "Method, pop, needs to be implemented"
55
+ end
56
+
57
+ # "Commit" queue
58
+ def ack
59
+ raise "Method, ack, needs to be implemented"
60
+ end
61
+
62
+ # At least called in the Host rescue block, to ensure all network links are healthy
63
+ def send( queueName, msg )
64
+ begin
65
+ @connection.close
66
+ rescue
67
+ puts "AppResource. An error was raised while closing connection to, " + @uri.to_s
68
+ end
69
+
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,64 @@
1
+ module RServiceBus
2
+
3
+ require "beanstalk-client"
4
+ require "rservicebus/MQ"
5
+
6
+ # Beanstalk client implementation.
7
+ #
8
+ class MQ_Beanstalk<MQ
9
+
10
+ # Connect to the broker
11
+ #
12
+ def connect( host, port )
13
+ port ||= 11300
14
+ string = "#{host}:#{port}"
15
+
16
+ begin
17
+ @beanstalk = Beanstalk::Pool.new([string])
18
+ rescue Exception => e
19
+ puts "Error connecting to Beanstalk"
20
+ puts "Host string, #{string}"
21
+ if e.message == "Beanstalk::NotConnected" then
22
+ puts "***Most likely, beanstalk is not running. Start beanstalk, and try running this again."
23
+ puts "***If you still get this error, check beanstalk is running at, #{string}"
24
+ else
25
+ puts e.message
26
+ puts e.backtrace
27
+ end
28
+ abort()
29
+ end
30
+ end
31
+
32
+ # Connect to the queue
33
+ #
34
+ def subscribe( queuename )
35
+ @beanstalk.watch( queuename )
36
+ end
37
+
38
+ # Get next msg from queue
39
+ def pop
40
+ begin
41
+ @job = @beanstalk.reserve @timeout
42
+ rescue Exception => e
43
+ if e.message == "TIMED_OUT" then
44
+ raise NoMsgToProcess.new
45
+ end
46
+ raise e
47
+ end
48
+ return @job.body
49
+ end
50
+
51
+ # "Commit" queue
52
+ def ack
53
+ @job.delete
54
+ @job = nil;
55
+ end
56
+
57
+ # At least called in the Host rescue block, to ensure all network links are healthy
58
+ def send( queueName, msg )
59
+ @beanstalk.use( queueName )
60
+ @beanstalk.put( msg )
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,54 @@
1
+ module RServiceBus
2
+
3
+ require "bunny"
4
+ require "rservicebus/MQ"
5
+
6
+ # RabbitMQ client implementation.
7
+ #
8
+ class MQ_Bunny<MQ
9
+ @uri
10
+
11
+ # Connect to the broker
12
+ #
13
+ def connect( host, port )
14
+ port ||= 5672
15
+
16
+ @bunny = Bunny.new(:host=>host, :port=>port)
17
+ @bunny.start
18
+ @pop_exch = @bunny.exchange('rservicebus.pop')
19
+ @send_exch = @bunny.exchange('rservicebus.send')
20
+ end
21
+
22
+ # Connect to the queue
23
+ #
24
+ def subscribe( queueName )
25
+ @queue = @bunny.queue( queueName )
26
+ @queue.bind( @pop_exch );
27
+ end
28
+
29
+ # Get next msg from queue
30
+ def pop
31
+ msg = @queue.pop(:ack => true)[:payload]
32
+
33
+ if msg == :queue_empty then
34
+ raise NoMsgToProcess.new
35
+ end
36
+
37
+ return msg
38
+ end
39
+
40
+ # "Commit" the pop to the queue
41
+ def ack
42
+ @queue.ack
43
+ end
44
+
45
+ # Send a msg to a queue
46
+ def send( queueName, msg )
47
+ queue = @bunny.queue(queueName)
48
+ queue.bind(@send_exch)
49
+ @send_exch.publish(msg)
50
+ queue.unbind(@send_exch)
51
+ end
52
+
53
+ end
54
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rservicebus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.18
4
+ version: 0.0.21
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-04 00:00:00.000000000 Z
12
+ date: 2012-10-10 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A Ruby interpretation of NServiceBus
15
15
  email: guy@guyirvine.com
@@ -19,7 +19,8 @@ executables:
19
19
  extensions: []
20
20
  extra_rdoc_files: []
21
21
  files:
22
- - lib/rservicebus/Agent.rb
22
+ - lib/rservicebus/Agent/Beanstalk.rb
23
+ - lib/rservicebus/Agent/Bunny.rb
23
24
  - lib/rservicebus/AppResource/FluidDbMysql.rb
24
25
  - lib/rservicebus/AppResource/FluidDbMysql2.rb
25
26
  - lib/rservicebus/AppResource/FluidDbPgsql.rb
@@ -28,12 +29,16 @@ files:
28
29
  - lib/rservicebus/AppResource.rb
29
30
  - lib/rservicebus/Config.rb
30
31
  - lib/rservicebus/ConfigureAppResource.rb
32
+ - lib/rservicebus/ConfigureMQ.rb
31
33
  - lib/rservicebus/ErrorMessage.rb
32
34
  - lib/rservicebus/HandlerLoader.rb
33
35
  - lib/rservicebus/helper_functions.rb
34
36
  - lib/rservicebus/Host.rb
35
37
  - lib/rservicebus/Message/Subscription.rb
36
38
  - lib/rservicebus/Message.rb
39
+ - lib/rservicebus/MQ/Beanstalk.rb
40
+ - lib/rservicebus/MQ/Bunny.rb
41
+ - lib/rservicebus/MQ.rb
37
42
  - lib/rservicebus/Stats.rb
38
43
  - lib/rservicebus/SubscriptionManager.rb
39
44
  - lib/rservicebus/SubscriptionStorage/Redis.rb