rservicebus 0.0.22 → 0.0.23
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/{ReturnErroredMessagesToSourceQueue → ReturnErroredMessagesToSourceQueueBeanstalk} +2 -1
- data/bin/ReturnErroredMessagesToSourceQueueBunny +46 -0
- data/lib/rservicebus/Agent.rb +20 -0
- data/lib/rservicebus/Agent/Bunny.rb +1 -2
- data/lib/rservicebus/AppResource.rb +1 -1
- data/lib/rservicebus/Saga.rb +141 -0
- metadata +8 -4
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
|
5
|
+
require "bunny"
|
6
|
+
|
7
|
+
require "rservicebus"
|
8
|
+
|
9
|
+
host = 'localhost:11300'
|
10
|
+
errorQueueName = "error"
|
11
|
+
|
12
|
+
bunny = Bunny.new(:host=>host)
|
13
|
+
bunny.start
|
14
|
+
direct_exchange = @bunny.exchange('rservicebus.agent')
|
15
|
+
|
16
|
+
q = @bunny.queue(errorQueueName)
|
17
|
+
|
18
|
+
number_of_messages = 0
|
19
|
+
loop = true
|
20
|
+
while loop do
|
21
|
+
msg = q.pop[:payload]
|
22
|
+
if msg == :queue_empty then
|
23
|
+
loop = false
|
24
|
+
else
|
25
|
+
number_of_messages++
|
26
|
+
|
27
|
+
msg = YAML::load(msg)
|
28
|
+
|
29
|
+
queueName = msg.getLastErrorMsg.sourceQueue
|
30
|
+
sq = bunny.queue(queueName)
|
31
|
+
sq.bind(@direct_exchange)
|
32
|
+
#q.publish( serialized_object )
|
33
|
+
|
34
|
+
@direct_exchange.publish(msg)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
if count == 0 then
|
40
|
+
puts "Nothing waiting on the error queue"
|
41
|
+
else
|
42
|
+
|
43
|
+
puts "Returned #{number_of_messages} to their source queue"
|
44
|
+
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module RServiceBus
|
2
|
+
|
3
|
+
#A means for a stand-alone process to interact with the bus, without being a full
|
4
|
+
#rservicebus application
|
5
|
+
class Agent
|
6
|
+
|
7
|
+
def getAgent( uri )
|
8
|
+
if uri.scheme == "beanstalk" then
|
9
|
+
require "rservicebus/Agent/Beanstalk"
|
10
|
+
return Agent_Beanstalk.new()
|
11
|
+
elsif uri.scheme == "bunny" then
|
12
|
+
require "rservicebus/Agent/Bunny"
|
13
|
+
return Agent_Bunny.new()
|
14
|
+
else
|
15
|
+
raise StandardError.new( "Scheme not recognised" )
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -5,7 +5,7 @@ require 'bunny'
|
|
5
5
|
#rservicebus application
|
6
6
|
class Agent_Bunny
|
7
7
|
@bunny
|
8
|
-
|
8
|
+
|
9
9
|
def initialize(host='localhost')
|
10
10
|
@bunny = Bunny.new(:host=>host)
|
11
11
|
@bunny.start
|
@@ -20,7 +20,6 @@ class Agent_Bunny
|
|
20
20
|
def sendMsg(messageObj, queueName, returnAddress=nil)
|
21
21
|
msg = RServiceBus::Message.new( messageObj, returnAddress )
|
22
22
|
serialized_object = YAML::dump(msg)
|
23
|
-
|
24
23
|
|
25
24
|
q = @bunny.queue(queueName)
|
26
25
|
q.bind(@direct_exchange)
|
@@ -0,0 +1,141 @@
|
|
1
|
+
module RServiceBus
|
2
|
+
|
3
|
+
#Requirements for Saga.
|
4
|
+
#
|
5
|
+
#Technicalities
|
6
|
+
#correlation: how to tie two independant msgs together in a single saga
|
7
|
+
#
|
8
|
+
#Multiple messages - Any of which can start the saga
|
9
|
+
#Timeouts
|
10
|
+
#Persistent Data between calls
|
11
|
+
#Ability to "complete" a saga, but not compulsory to do so.
|
12
|
+
|
13
|
+
|
14
|
+
require "uri"
|
15
|
+
|
16
|
+
|
17
|
+
class Saga_Data_InMemory
|
18
|
+
|
19
|
+
attr_reader :data_hash
|
20
|
+
|
21
|
+
@data_hash
|
22
|
+
|
23
|
+
def initialize
|
24
|
+
@data_hash = Hash.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def get( saga, msg, mapping )
|
28
|
+
@data_hash[saga.class.name] = Hash.new if @data_hash[saga.class.name].nil?
|
29
|
+
@data_hash[saga.class.name][msg.class.name] = Array.new if @data_hash[saga.class.name][msg.class.name].nil?
|
30
|
+
|
31
|
+
if !mapping[msg.class.name].nil? then
|
32
|
+
mapping[msg.class.name].each do |msgFieldName,sagaFieldName|
|
33
|
+
|
34
|
+
@data_hash[saga.class.name][msg.class.name].each do |data|
|
35
|
+
if !data[sagaFieldName].nil? then
|
36
|
+
return data if msg.instance_variable_get(msgFieldName) == data[sagaFieldName]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
hash = Hash.new
|
43
|
+
@data_hash[saga.class.name][msg.class.name].push( hash )
|
44
|
+
return hash;
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
# Wrapper base class for resources used by applications, allowing rservicebus to configure the resource
|
50
|
+
# - dependency injection.
|
51
|
+
#
|
52
|
+
class Saga_Manager
|
53
|
+
|
54
|
+
#correlation strategy
|
55
|
+
# correlation strategy return an instance of the saga.
|
56
|
+
# that way, we can return an existing one, or create a new one
|
57
|
+
|
58
|
+
# Start with sagaid
|
59
|
+
|
60
|
+
# def Handle_MsgName( msg, data )
|
61
|
+
|
62
|
+
# end
|
63
|
+
|
64
|
+
def initialize
|
65
|
+
@sagas = Hash.new
|
66
|
+
@saga_data = Saga_Data_InMemory.new
|
67
|
+
end
|
68
|
+
|
69
|
+
def getMsgNames( sagaClass )
|
70
|
+
list = []
|
71
|
+
sagaClass.instance_methods.each do |name|
|
72
|
+
list.push name.to_s.sub( "Handle_", "" ) if name.to_s.slice( 0,7 ) == "Handle_"
|
73
|
+
end
|
74
|
+
|
75
|
+
return list
|
76
|
+
end
|
77
|
+
|
78
|
+
def addSaga( sagaClass )
|
79
|
+
saga = sagaClass.new
|
80
|
+
hash = Hash["saga", saga, "mapping", saga.mapping]
|
81
|
+
self.getMsgNames( sagaClass ).each do |name|
|
82
|
+
sagas[name] = Array.new if sagas[name].nil?
|
83
|
+
@sagas[name].push( hash )
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def Handle( msg )
|
88
|
+
return if @sagas[msg.class.name].nil?
|
89
|
+
|
90
|
+
@sagas[msg.class.name].each do |hash|
|
91
|
+
saga = hash["saga"]
|
92
|
+
|
93
|
+
data = @saga_data.get( saga, msg, hash["mapping"] )
|
94
|
+
|
95
|
+
saga.data = data
|
96
|
+
saga.Handle( msg )
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
class Saga
|
104
|
+
attr_accessor :data, :mapping
|
105
|
+
attr_reader :data
|
106
|
+
|
107
|
+
@data
|
108
|
+
@mapping
|
109
|
+
|
110
|
+
def initialize
|
111
|
+
@mapping = Hash.new
|
112
|
+
self.ConfigureHowToFindSaga
|
113
|
+
end
|
114
|
+
|
115
|
+
def ConfigureHowToFindSaga()
|
116
|
+
throw StandardError.new( "ConfigureHowToFindSaga needs to be implemented" );
|
117
|
+
end
|
118
|
+
|
119
|
+
def ConfigureMapping( msg, sagaFieldName, msgFieldName);
|
120
|
+
# if !msg.has_attribute?( msgFieldName ) then
|
121
|
+
# raise StandardError.new( "Msg, #{msg.name}, doesn't have a field named, #{msgFieldName}" )
|
122
|
+
#end
|
123
|
+
@mapping[msg.name] = Hash.new if @mapping[msg.name].nil?
|
124
|
+
@mapping[msg.name]["@" + msgFieldName] = sagaFieldName
|
125
|
+
end
|
126
|
+
|
127
|
+
def complete
|
128
|
+
end
|
129
|
+
|
130
|
+
def Handle( msg )
|
131
|
+
methodName = "Handle_#{msg.class.name}"
|
132
|
+
|
133
|
+
self.send methodName, msg
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class Saga_Manager
|
138
|
+
|
139
|
+
|
140
|
+
end
|
141
|
+
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.23
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,18 +9,20 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-25 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A Ruby interpretation of NServiceBus
|
15
15
|
email: guy@guyirvine.com
|
16
16
|
executables:
|
17
17
|
- rservicebus
|
18
|
-
-
|
18
|
+
- ReturnErroredMessagesToSourceQueueBeanstalk
|
19
|
+
- ReturnErroredMessagesToSourceQueueBunny
|
19
20
|
extensions: []
|
20
21
|
extra_rdoc_files: []
|
21
22
|
files:
|
22
23
|
- lib/rservicebus/Agent/Beanstalk.rb
|
23
24
|
- lib/rservicebus/Agent/Bunny.rb
|
25
|
+
- lib/rservicebus/Agent.rb
|
24
26
|
- lib/rservicebus/AppResource/FluidDbMysql.rb
|
25
27
|
- lib/rservicebus/AppResource/FluidDbMysql2.rb
|
26
28
|
- lib/rservicebus/AppResource/FluidDbPgsql.rb
|
@@ -39,6 +41,7 @@ files:
|
|
39
41
|
- lib/rservicebus/MQ/Beanstalk.rb
|
40
42
|
- lib/rservicebus/MQ/Bunny.rb
|
41
43
|
- lib/rservicebus/MQ.rb
|
44
|
+
- lib/rservicebus/Saga.rb
|
42
45
|
- lib/rservicebus/Stats.rb
|
43
46
|
- lib/rservicebus/SubscriptionManager.rb
|
44
47
|
- lib/rservicebus/SubscriptionStorage/Redis.rb
|
@@ -47,7 +50,8 @@ files:
|
|
47
50
|
- lib/rservicebus/Test/Redis.rb
|
48
51
|
- lib/rservicebus/Test.rb
|
49
52
|
- lib/rservicebus.rb
|
50
|
-
- bin/
|
53
|
+
- bin/ReturnErroredMessagesToSourceQueueBeanstalk
|
54
|
+
- bin/ReturnErroredMessagesToSourceQueueBunny
|
51
55
|
- bin/rservicebus
|
52
56
|
- LICENSE
|
53
57
|
- README.md
|