rservicebus 0.0.41 → 0.0.42
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/rservicebus.rb +3 -0
- data/lib/rservicebus/Config.rb +5 -3
- data/lib/rservicebus/ConfigureAppResource.rb +1 -1
- data/lib/rservicebus/ConfigureMonitor.rb +82 -0
- data/lib/rservicebus/HandlerLoader.rb +16 -15
- data/lib/rservicebus/Host.rb +27 -13
- data/lib/rservicebus/Monitor.rb +64 -0
- data/lib/rservicebus/Monitor/CsvDir.rb +11 -0
- data/lib/rservicebus/Monitor/CsvPerLine.rb +13 -0
- data/lib/rservicebus/Monitor/Dir.rb +31 -0
- data/lib/rservicebus/Monitor/Message.rb +10 -0
- data/lib/rservicebus/Monitor/XmlDir.rb +12 -0
- metadata +9 -2
data/lib/rservicebus.rb
CHANGED
@@ -6,6 +6,7 @@ require "yaml"
|
|
6
6
|
require "uuidtools"
|
7
7
|
require "redis"
|
8
8
|
require "json"
|
9
|
+
require "uri"
|
9
10
|
|
10
11
|
require "rservicebus/helper_functions"
|
11
12
|
require "rservicebus/ErrorMessage"
|
@@ -26,6 +27,8 @@ require "rservicebus/SubscriptionManager"
|
|
26
27
|
require "rservicebus/SubscriptionStorage"
|
27
28
|
require "rservicebus/ConfigureSubscriptionStorage"
|
28
29
|
|
30
|
+
require "rservicebus/ConfigureMonitor"
|
31
|
+
|
29
32
|
require 'rservicebus/Agent'
|
30
33
|
|
31
34
|
|
data/lib/rservicebus/Config.rb
CHANGED
@@ -118,13 +118,15 @@ class Config
|
|
118
118
|
#Expected format;
|
119
119
|
# /one/two/Contracts
|
120
120
|
def loadContracts()
|
121
|
-
|
121
|
+
@contractList = Array.new
|
122
|
+
|
123
|
+
#This is a guard clause in case no Contracts have been specified
|
124
|
+
#If any guard clauses have been specified, then execution should drop to the second block
|
125
|
+
if self.getValue( "CONTRACTS" ).nil? then
|
122
126
|
return self
|
123
127
|
end
|
124
|
-
@contractList = Array.new
|
125
128
|
|
126
129
|
self.getValue( "CONTRACTS", "./Contract" ).split( ";" ).each do |path|
|
127
|
-
log "Loading contracts from, #{path}"
|
128
130
|
self.ensureContractFileExists( path )
|
129
131
|
@contractList << path
|
130
132
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module RServiceBus
|
2
|
+
|
3
|
+
require 'rservicebus/Monitor'
|
4
|
+
require 'rservicebus/Monitor/Message'
|
5
|
+
|
6
|
+
#Configure AppResources for an rservicebus host
|
7
|
+
class ConfigureMonitor
|
8
|
+
|
9
|
+
@resourceList
|
10
|
+
|
11
|
+
# Constructor
|
12
|
+
#
|
13
|
+
# @param [RServiceBus::Host] host instance
|
14
|
+
# @param [Hash] appResources As hash[k,v] where k is the name of a resource, and v is the resource
|
15
|
+
def initialize( host, appResources )
|
16
|
+
@host = host
|
17
|
+
@appResources = appResources
|
18
|
+
|
19
|
+
@handlerList = Hash.new
|
20
|
+
@resourceList = Hash.new
|
21
|
+
end
|
22
|
+
|
23
|
+
# Assigns appropriate resources to writable attributes in the handler that match keys in the resource hash
|
24
|
+
#
|
25
|
+
# @param [RServiceBus::Handler] handler
|
26
|
+
## @param [Hash] appResources As hash[k,v] where k is the name of a resource, and v is the resource
|
27
|
+
def setAppResources( monitor )
|
28
|
+
@host.log "Checking app resources for: #{monitor.class.name}", true
|
29
|
+
@host.log "If your attribute is not getting set, check that it is in the 'attr_accessor' list", true
|
30
|
+
@appResources.each do |k,v|
|
31
|
+
if monitor.class.method_defined?( k ) then
|
32
|
+
monitor.instance_variable_set( "@#{k}", v.getResource() )
|
33
|
+
@resourceList[monitor.class.name] = Array.new if @resourceList[monitor.class.name].nil?
|
34
|
+
@resourceList[monitor.class.name] << v
|
35
|
+
@host.log "App resource attribute, #{k}, set for: " + monitor.class.name
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
return self
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def getMonitors( env )
|
44
|
+
monitors = Array.new
|
45
|
+
|
46
|
+
env.each do |k,v|
|
47
|
+
if v.is_a?(String) and
|
48
|
+
k.start_with?( "RSBOB_" ) then
|
49
|
+
uri = URI.parse( v )
|
50
|
+
name = k.sub( "RSBOB_", "" )
|
51
|
+
monitor = nil?
|
52
|
+
case uri.scheme
|
53
|
+
when "csvdir"
|
54
|
+
require "rservicebus/Monitor/CsvDir"
|
55
|
+
monitor = Monitor_CsvDir.new( @host, name, uri )
|
56
|
+
|
57
|
+
when "xmldir"
|
58
|
+
require "rservicebus/Monitor/XmlDir"
|
59
|
+
monitor = Monitor_XmlDir.new( @host, name, uri )
|
60
|
+
|
61
|
+
when "dir"
|
62
|
+
require "rservicebus/Monitor/Dir"
|
63
|
+
monitor = Monitor_Dir.new( @host, name, uri )
|
64
|
+
|
65
|
+
when "csvperlinedir"
|
66
|
+
require "rservicebus/Monitor/CsvPerLine"
|
67
|
+
monitor = Monitor_CsvPerLineDir.new( @host, name, uri )
|
68
|
+
else
|
69
|
+
abort("Scheme, #{uri.scheme}, not recognised when configuring Monitor, #{k}=#{v}");
|
70
|
+
end
|
71
|
+
self.setAppResources( monitor )
|
72
|
+
monitors << monitor
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
return monitors
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
@@ -22,6 +22,8 @@ class HandlerLoader
|
|
22
22
|
|
23
23
|
@handlerList
|
24
24
|
@resourceList
|
25
|
+
|
26
|
+
@listOfLoadedPaths
|
25
27
|
|
26
28
|
# Constructor
|
27
29
|
#
|
@@ -33,6 +35,8 @@ class HandlerLoader
|
|
33
35
|
|
34
36
|
@handlerList = Hash.new
|
35
37
|
@resourceList = Hash.new
|
38
|
+
|
39
|
+
@listOfLoadedPaths = Hash.new
|
36
40
|
end
|
37
41
|
|
38
42
|
# Cleans the given path to ensure it can be used for as a parameter for the require statement.
|
@@ -110,7 +114,12 @@ class HandlerLoader
|
|
110
114
|
# @param [String] filePath
|
111
115
|
# @param [String] handlerName
|
112
116
|
# @returns [RServiceBus::Handler] handler
|
113
|
-
def loadAndConfigureHandler(filePath, handlerName)
|
117
|
+
def loadAndConfigureHandler(msgName, filePath, handlerName)
|
118
|
+
if @listOfLoadedPaths.has_key?( filePath ) then
|
119
|
+
@host.log "Not reloading, #{filePath}"
|
120
|
+
return
|
121
|
+
end
|
122
|
+
|
114
123
|
begin
|
115
124
|
@host.log "filePath: " + filePath, true
|
116
125
|
@host.log "handlerName: " + handlerName, true
|
@@ -120,7 +129,10 @@ class HandlerLoader
|
|
120
129
|
self.setAppResources( handler )
|
121
130
|
@host.log "Loaded Handler: " + handlerName
|
122
131
|
|
123
|
-
|
132
|
+
@handlerList[msgName] = Array.new unless @handlerList.has_key?( msgName )
|
133
|
+
@handlerList[msgName] << handler;
|
134
|
+
|
135
|
+
@listOfLoadedPaths[filePath] = 1
|
124
136
|
rescue Exception => e
|
125
137
|
puts "Exception loading handler from file: " + filePath
|
126
138
|
puts e.message
|
@@ -155,12 +167,7 @@ class HandlerLoader
|
|
155
167
|
fileName = File.basename( filePath ).sub( ".rb", "" )
|
156
168
|
handlerName = "MessageHandler_#{msgName}_#{fileName}"
|
157
169
|
|
158
|
-
|
159
|
-
if !@handlerList.has_key?( msgName ) then
|
160
|
-
@handlerList[msgName] = Array.new
|
161
|
-
end
|
162
|
-
|
163
|
-
@handlerList[msgName] << handler;
|
170
|
+
self.loadAndConfigureHandler( msgName, filePath, handlerName )
|
164
171
|
end
|
165
172
|
end
|
166
173
|
end
|
@@ -194,13 +201,7 @@ class HandlerLoader
|
|
194
201
|
self.loadHandlersFromSecondLevelPath( msgName, filePath )
|
195
202
|
else
|
196
203
|
handlerName = "MessageHandler_#{msgName}"
|
197
|
-
|
198
|
-
|
199
|
-
if !@handlerList.has_key?( msgName ) then
|
200
|
-
@handlerList[msgName] = Array.new
|
201
|
-
end
|
202
|
-
|
203
|
-
@handlerList[msgName] << handler;
|
204
|
+
self.loadAndConfigureHandler( msgName, filePath, handlerName )
|
204
205
|
end
|
205
206
|
end
|
206
207
|
end
|
data/lib/rservicebus/Host.rb
CHANGED
@@ -33,14 +33,21 @@ module RServiceBus
|
|
33
33
|
puts "[#{type}] #{timestamp} :: #{string}"
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
#Thin veneer for Configuring external resources
|
38
38
|
#
|
39
39
|
def configureAppResource
|
40
40
|
@appResources = ConfigureAppResource.new.getResources( ENV )
|
41
41
|
return self;
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
|
+
#Thin veneer for Configuring external resources
|
45
|
+
#
|
46
|
+
def configureMonitors
|
47
|
+
@monitors = ConfigureMonitor.new( self, @appResources ).getMonitors( ENV )
|
48
|
+
return self;
|
49
|
+
end
|
50
|
+
|
44
51
|
#Thin veneer for Configuring the Message Queue
|
45
52
|
#
|
46
53
|
def connectToMq
|
@@ -48,7 +55,7 @@ module RServiceBus
|
|
48
55
|
|
49
56
|
return self
|
50
57
|
end
|
51
|
-
|
58
|
+
|
52
59
|
#Subscriptions are specified by adding events to the
|
53
60
|
#msg endpoint mapping
|
54
61
|
def sendSubscriptions
|
@@ -70,11 +77,11 @@ module RServiceBus
|
|
70
77
|
def loadHandlers()
|
71
78
|
log "Load Message Handlers"
|
72
79
|
@handlerLoader = HandlerLoader.new( self, @appResources )
|
73
|
-
|
80
|
+
|
74
81
|
@config.handlerPathList.each do |path|
|
75
82
|
@handlerLoader.loadHandlersFromPath(path)
|
76
83
|
end
|
77
|
-
|
84
|
+
|
78
85
|
@handlerList = @handlerLoader.handlerList
|
79
86
|
@resourceByHandlerNameList = @handlerLoader.resourceList
|
80
87
|
|
@@ -85,9 +92,10 @@ module RServiceBus
|
|
85
92
|
#
|
86
93
|
def loadContracts()
|
87
94
|
log "Load Contracts"
|
88
|
-
|
95
|
+
|
89
96
|
@config.contractList.each do |path|
|
90
97
|
require path
|
98
|
+
log "Loaded Contract: #{path}", true
|
91
99
|
end
|
92
100
|
|
93
101
|
return self
|
@@ -129,7 +137,6 @@ module RServiceBus
|
|
129
137
|
end
|
130
138
|
|
131
139
|
def initialize()
|
132
|
-
|
133
140
|
@config = ConfigFromEnv.new
|
134
141
|
.configureLogging()
|
135
142
|
.loadHostSection()
|
@@ -141,11 +148,12 @@ module RServiceBus
|
|
141
148
|
.loadWorkingDirList();
|
142
149
|
|
143
150
|
self.configureStatistics()
|
144
|
-
.configureAppResource()
|
145
|
-
.connectToMq()
|
146
|
-
.loadHandlers()
|
147
151
|
.loadContracts()
|
148
152
|
.loadLibs()
|
153
|
+
.configureAppResource()
|
154
|
+
.configureMonitors()
|
155
|
+
.loadHandlers()
|
156
|
+
.connectToMq()
|
149
157
|
.configureSubscriptions()
|
150
158
|
.sendSubscriptions()
|
151
159
|
|
@@ -212,7 +220,7 @@ module RServiceBus
|
|
212
220
|
end
|
213
221
|
tempResourceList.each {|k,resource| resource.reconnect }
|
214
222
|
tempHandlerList.each {|k,handler| @handlerLoader.setAppResources( handler ) }
|
215
|
-
|
223
|
+
|
216
224
|
if retries > 0 then
|
217
225
|
retries = retries - 1
|
218
226
|
@mq.returnToQueue
|
@@ -248,6 +256,12 @@ module RServiceBus
|
|
248
256
|
rescue NoMsgToProcess => e
|
249
257
|
#This exception is just saying there are no messages to process
|
250
258
|
statOutputCountdown = 0
|
259
|
+
|
260
|
+
@monitors.each do |o|
|
261
|
+
o.Look
|
262
|
+
end
|
263
|
+
|
264
|
+
|
251
265
|
rescue Exception => e
|
252
266
|
if e.message == "SIGTERM" then
|
253
267
|
puts "Exiting on request ..."
|
@@ -273,7 +287,7 @@ module RServiceBus
|
|
273
287
|
puts "No handler found for: " + msgName
|
274
288
|
puts YAML::dump(@msg)
|
275
289
|
raise "No Handler Found"
|
276
|
-
|
290
|
+
|
277
291
|
else
|
278
292
|
log "Handler found for: " + msgName, true
|
279
293
|
handlerList.each do |handler|
|
@@ -287,7 +301,7 @@ module RServiceBus
|
|
287
301
|
end
|
288
302
|
end
|
289
303
|
end
|
290
|
-
|
304
|
+
|
291
305
|
#Sends a msg across the bus
|
292
306
|
#
|
293
307
|
# @param [String] serialized_object serialized RServiceBus::Message
|
@@ -0,0 +1,64 @@
|
|
1
|
+
class Monitor
|
2
|
+
|
3
|
+
attr_accessor :Bus
|
4
|
+
|
5
|
+
@Bus
|
6
|
+
@uri
|
7
|
+
@connection
|
8
|
+
@MsgType
|
9
|
+
|
10
|
+
# The method which actually connects to the resource.
|
11
|
+
#
|
12
|
+
def connect(uri)
|
13
|
+
raise "Method, connect, needs to be implemented for resource"
|
14
|
+
end
|
15
|
+
|
16
|
+
# The method which actually connects to the resource.
|
17
|
+
#
|
18
|
+
def Look
|
19
|
+
raise "Method, Look, needs to be implemented for the Monitor"
|
20
|
+
end
|
21
|
+
|
22
|
+
def _connect
|
23
|
+
@connection = self.connect(@uri)
|
24
|
+
@Bus.log "#{self.class.name}. Connected to, #{@uri.to_s}" unless !ENV["QUIET"].nil?
|
25
|
+
end
|
26
|
+
|
27
|
+
# Resources are attached resources, and can be specified using the URI syntax.
|
28
|
+
#
|
29
|
+
# @param [String] uri a location for the resource to which we will attach, eg redis://127.0.0.1/foo
|
30
|
+
def initialize( bus, name, uri )
|
31
|
+
@Bus = bus
|
32
|
+
# @MsgType = Object.const_get( name )
|
33
|
+
newAnonymousClass = Class.new(Monitor_Message)
|
34
|
+
Object.const_set( name, newAnonymousClass )
|
35
|
+
@MsgType = Object.const_get( name )
|
36
|
+
|
37
|
+
|
38
|
+
@uri = uri
|
39
|
+
self._connect
|
40
|
+
end
|
41
|
+
|
42
|
+
# A notification that allows cleanup
|
43
|
+
def finished
|
44
|
+
end
|
45
|
+
|
46
|
+
# At least called in the Host rescue block, to ensure all network links are healthy
|
47
|
+
def reconnect
|
48
|
+
begin
|
49
|
+
self.finished
|
50
|
+
rescue Exception => e
|
51
|
+
puts "** Monitor. An error was raised while closing connection to, " + @uri.to_s
|
52
|
+
puts "Message: " + e.message
|
53
|
+
puts e.backtrace
|
54
|
+
end
|
55
|
+
|
56
|
+
self._connect
|
57
|
+
end
|
58
|
+
|
59
|
+
def send( payload )
|
60
|
+
msg = @MsgType.new( payload )
|
61
|
+
|
62
|
+
@Bus.Send( msg )
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
class Monitor_Dir<Monitor
|
3
|
+
|
4
|
+
@Path
|
5
|
+
|
6
|
+
def connect(uri)
|
7
|
+
#Pass the path through the Dir object to check syntax on startup
|
8
|
+
inputDir = Dir.new( uri.path )
|
9
|
+
@Path = inputDir.path
|
10
|
+
end
|
11
|
+
|
12
|
+
def ProcessPath( path )
|
13
|
+
return IO.read( path )
|
14
|
+
end
|
15
|
+
|
16
|
+
def ProcessFile( file )
|
17
|
+
payload = self.ProcessPath( file )
|
18
|
+
|
19
|
+
self.send( payload )
|
20
|
+
end
|
21
|
+
|
22
|
+
def Look
|
23
|
+
Dir.glob( "#{@Path}/*" ).each do |file|
|
24
|
+
self.ProcessFile( file )
|
25
|
+
|
26
|
+
File.unlink( file )
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
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.
|
4
|
+
version: 0.0.42
|
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: 2013-03-
|
12
|
+
date: 2013-03-09 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A Ruby interpretation of NServiceBus
|
15
15
|
email: guy@guyirvine.com
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- lib/rservicebus/AppResource.rb
|
37
37
|
- lib/rservicebus/Config.rb
|
38
38
|
- lib/rservicebus/ConfigureAppResource.rb
|
39
|
+
- lib/rservicebus/ConfigureMonitor.rb
|
39
40
|
- lib/rservicebus/ConfigureMQ.rb
|
40
41
|
- lib/rservicebus/ConfigureSubscriptionStorage.rb
|
41
42
|
- lib/rservicebus/ErrorMessage.rb
|
@@ -44,6 +45,12 @@ files:
|
|
44
45
|
- lib/rservicebus/Host.rb
|
45
46
|
- lib/rservicebus/Message/Subscription.rb
|
46
47
|
- lib/rservicebus/Message.rb
|
48
|
+
- lib/rservicebus/Monitor/CsvDir.rb
|
49
|
+
- lib/rservicebus/Monitor/CsvPerLine.rb
|
50
|
+
- lib/rservicebus/Monitor/Dir.rb
|
51
|
+
- lib/rservicebus/Monitor/Message.rb
|
52
|
+
- lib/rservicebus/Monitor/XmlDir.rb
|
53
|
+
- lib/rservicebus/Monitor.rb
|
47
54
|
- lib/rservicebus/MQ/Beanstalk.rb
|
48
55
|
- lib/rservicebus/MQ/Bunny.rb
|
49
56
|
- lib/rservicebus/MQ.rb
|