rservicebus2 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +64 -0
  3. data/bin/return_messages_to_source_queue +114 -0
  4. data/bin/rsb_ctl +38 -0
  5. data/bin/rservicebus2 +14 -0
  6. data/bin/rservicebus2-create +107 -0
  7. data/bin/rservicebus2-init +104 -0
  8. data/bin/rservicebus2-transport +16 -0
  9. data/bin/send_empty_message +15 -0
  10. data/lib/rservicebus.rb +59 -0
  11. data/lib/rservicebus/agent.rb +54 -0
  12. data/lib/rservicebus/appresource.rb +65 -0
  13. data/lib/rservicebus/appresource/dir.rb +29 -0
  14. data/lib/rservicebus/appresource/file.rb +8 -0
  15. data/lib/rservicebus/appresource/fluiddb.rb +24 -0
  16. data/lib/rservicebus/appresource_configure.rb +33 -0
  17. data/lib/rservicebus/audit.rb +28 -0
  18. data/lib/rservicebus/circuitbreaker.rb +79 -0
  19. data/lib/rservicebus/config.rb +168 -0
  20. data/lib/rservicebus/cron_manager.rb +76 -0
  21. data/lib/rservicebus/endpointmapping.rb +72 -0
  22. data/lib/rservicebus/errormessage.rb +14 -0
  23. data/lib/rservicebus/handler_loader.rb +162 -0
  24. data/lib/rservicebus/handler_manager.rb +131 -0
  25. data/lib/rservicebus/helper_functions.rb +85 -0
  26. data/lib/rservicebus/host.rb +487 -0
  27. data/lib/rservicebus/message.rb +78 -0
  28. data/lib/rservicebus/message/statisticoutput.rb +7 -0
  29. data/lib/rservicebus/message/subscription.rb +10 -0
  30. data/lib/rservicebus/message/verboseoutput.rb +7 -0
  31. data/lib/rservicebus/monitor.rb +61 -0
  32. data/lib/rservicebus/monitor/csvdir.rb +52 -0
  33. data/lib/rservicebus/monitor/dir.rb +139 -0
  34. data/lib/rservicebus/monitor/dirnotifier.rb +101 -0
  35. data/lib/rservicebus/monitor/message.rb +11 -0
  36. data/lib/rservicebus/monitor/xmldir.rb +11 -0
  37. data/lib/rservicebus/monitor_configure.rb +71 -0
  38. data/lib/rservicebus/mq.rb +98 -0
  39. data/lib/rservicebus/mq/beanstalk.rb +72 -0
  40. data/lib/rservicebus/resource_manager.rb +69 -0
  41. data/lib/rservicebus/saga/base.rb +17 -0
  42. data/lib/rservicebus/saga/data.rb +20 -0
  43. data/lib/rservicebus/saga/manager.rb +128 -0
  44. data/lib/rservicebus/saga_loader.rb +118 -0
  45. data/lib/rservicebus/saga_storage.rb +18 -0
  46. data/lib/rservicebus/saga_storage/dir.rb +87 -0
  47. data/lib/rservicebus/saga_storage/inmemory.rb +37 -0
  48. data/lib/rservicebus/sendat_manager.rb +33 -0
  49. data/lib/rservicebus/sendat_storage.rb +20 -0
  50. data/lib/rservicebus/sendat_storage/file.rb +37 -0
  51. data/lib/rservicebus/sendat_storage/inmemory.rb +20 -0
  52. data/lib/rservicebus/state_manager.rb +30 -0
  53. data/lib/rservicebus/state_storage.rb +18 -0
  54. data/lib/rservicebus/state_storage/dir.rb +66 -0
  55. data/lib/rservicebus/state_storage/inmemory.rb +25 -0
  56. data/lib/rservicebus/statistic_manager.rb +86 -0
  57. data/lib/rservicebus/stats.rb +68 -0
  58. data/lib/rservicebus/subscription_manager.rb +31 -0
  59. data/lib/rservicebus/subscription_storage.rb +39 -0
  60. data/lib/rservicebus/subscription_storage/file.rb +42 -0
  61. data/lib/rservicebus/subscription_storage/redis.rb +69 -0
  62. data/lib/rservicebus/subscription_storage_configure.rb +19 -0
  63. data/lib/rservicebus/test.rb +2 -0
  64. data/lib/rservicebus/test/bus.rb +32 -0
  65. data/lib/rservicebus/transporter.rb +142 -0
  66. data/lib/rservicebus/usermessage/withpayload.rb +10 -0
  67. metadata +184 -0
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # The application 'rservicebus-transport' is installed as part of a gem, and
4
+ # this file is here to facilitate running it.
5
+ #
6
+
7
+ require 'rubygems'
8
+ require 'rservicebus'
9
+ require 'rservicebus/Transporter'
10
+
11
+ def run_rservicebus_transport()
12
+ RServiceBus::Transporter.new().Run()
13
+ end
14
+
15
+ run_rservicebus_transport
16
+
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rservicebus'
4
+ require 'rservicebus/Agent'
5
+
6
+
7
+ abort( "Usage: #{File.basename($0)} <Msg Name> <Queue Name> [Response Queue Name] [Beanstalk Host]" ) unless ARGV.length >=2 && ARGV.length <=4
8
+ msg_name = ARGV[0]
9
+ queue_name = ARGV[1]
10
+ response_queue_name = "#{queue_name}Response" if ARGV.length >= 3
11
+ beanstalkHost = 'beanstalk://localhost' if ARGV.length <= 4
12
+
13
+ agent = RServiceBus::Agent.new.getAgent( URI.parse( beanstalkHost) )
14
+ msg = RServiceBus.createAnonymousClass( msg_name )
15
+ agent.sendMsg(msg, queue_name, response_queue_name)
@@ -0,0 +1,59 @@
1
+ # Add the currently running directory to the start of the load path
2
+ # $:.unshift File.dirname(__FILE__) + '/../../lib'
3
+
4
+ # Don't buffer stdout
5
+ $stdout.sync = true
6
+
7
+ require 'rubygems'
8
+ require 'yaml'
9
+ require 'uuidtools'
10
+ require 'json'
11
+ require 'uri'
12
+
13
+ require 'rservicebus/helper_functions'
14
+ require 'rservicebus/errormessage'
15
+ require 'rservicebus/handler_loader'
16
+ require 'rservicebus/handler_manager'
17
+ require 'rservicebus/appresource_configure'
18
+ require 'rservicebus/mq'
19
+ require 'rservicebus/host'
20
+ require 'rservicebus/config'
21
+ require 'rservicebus/endpointmapping'
22
+ require 'rservicebus/stats'
23
+ require 'rservicebus/statistic_manager'
24
+ require 'rservicebus/audit'
25
+
26
+ require 'rservicebus/message'
27
+ require 'rservicebus/message/subscription'
28
+ require 'rservicebus/message/statisticoutput'
29
+ require 'rservicebus/message/verboseoutput'
30
+
31
+ require 'rservicebus/usermessage/withpayload'
32
+
33
+ require 'rservicebus/state_manager'
34
+ require 'rservicebus/cron_manager'
35
+ require 'rservicebus/circuitbreaker'
36
+
37
+ require 'rservicebus/appresource'
38
+ require 'rservicebus/resource_manager'
39
+
40
+ require 'rservicebus/subscription_manager'
41
+ require 'rservicebus/subscription_storage'
42
+ require 'rservicebus/subscription_storage_configure'
43
+
44
+ require 'rservicebus/monitor_configure'
45
+
46
+ require 'rservicebus/agent'
47
+
48
+ require 'rservicebus/saga_loader.rb'
49
+ require 'rservicebus/saga/manager.rb'
50
+ require 'rservicebus/saga/data.rb'
51
+ require 'rservicebus/saga/base.rb'
52
+
53
+ require 'rservicebus/saga_storage'
54
+
55
+ require 'rservicebus/sendat_manager'
56
+
57
+ # Initial definition of the namespace
58
+ module RServiceBus
59
+ end
@@ -0,0 +1,54 @@
1
+ module RServiceBus
2
+ class QueueNotFoundForMsg < StandardError
3
+ end
4
+
5
+ # A means for a stand-alone process to interact with the bus, without being
6
+ # a full rservicebus application
7
+ class Agent
8
+ def get_agent(uri)
9
+ ENV['RSBMQ'] = uri.to_s
10
+
11
+ RServiceBus.rlog '*** Agent.getAgent has been deprecated. Set the
12
+ environment variable, RSBMQ, and simply create the class'
13
+ Agent.new
14
+ end
15
+
16
+ def initialize
17
+ @mq = MQ.get
18
+ end
19
+
20
+ # Put a msg on the bus
21
+ #
22
+ # @param [Object] messageObj The msg to be sent
23
+ # @param [String] queueName the name of the queue to be send the msg to
24
+ # @param [String] returnAddress the name of a queue to send replies to
25
+ def send_msg(message_obj, queue_name, return_address = nil)
26
+ fail QueueNotFoundForMsg, message_obj.class.name if queue_name.nil?
27
+
28
+ msg = RServiceBus::Message.new(message_obj, return_address)
29
+ if queue_name.index('@').nil?
30
+ q = queue_name
31
+ else
32
+ parts = queueName.split('@')
33
+ msg.set_remote_queue_name(parts[0])
34
+ msg.set_remote_host_name(parts[1])
35
+ q = 'transport-out'
36
+ end
37
+
38
+ serialized_object = YAML.dump(msg)
39
+
40
+ @mq.send(q, serialized_object)
41
+ end
42
+
43
+ # Gives an agent the means to receive a reply
44
+ #
45
+ # @param [String] queueName the name of the queue to monitor for messages
46
+ def check_for_reply(queue_name)
47
+ @mq.subscribe(queue_name)
48
+ body = @mq.pop
49
+ @msg = YAML.load(body)
50
+ @mq.ack
51
+ @msg.msg
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,65 @@
1
+ require 'uri'
2
+
3
+ module RServiceBus
4
+ # Wrapper base class for resources used by applications, allowing rservicebus
5
+ # to configure the resource - dependency injection.
6
+ class AppResource
7
+ attr_reader :connection
8
+
9
+ # The method which actually connects to the resource.
10
+ def connect(_uri)
11
+ fail 'Method, connect, needs to be implemented for resource'
12
+ end
13
+
14
+ def _connect
15
+ @connection = connect(@uri)
16
+ RServiceBus.rlog "#{self.class.name}. Connected to, #{@uri}"
17
+ end
18
+
19
+ def get_resource
20
+ @connection
21
+ end
22
+
23
+ # Resources are attached, and can be specified using the URI syntax.
24
+ # @param [String] uri a location for the resource to which we will attach,
25
+ # eg redis://127.0.0.1/foo
26
+ def initialize(host, uri)
27
+ @host = host
28
+ @uri = uri
29
+ # Do a connect / disconnect loop on startup to validate the connection
30
+ _connect
31
+ finished
32
+ end
33
+
34
+ # A notification that ocurs after getResource, to allow cleanup
35
+ def finished
36
+ @connection.close
37
+ end
38
+
39
+ # At least called in the Host rescue block, to ensure all network links are
40
+ # healthy
41
+ def reconnect
42
+ begin
43
+ finished
44
+ rescue StandardError => e
45
+ puts '** AppResource. An error was raised while closing connection
46
+ to, ' + @uri
47
+ puts 'Message: ' + e.message
48
+ puts e.backtrace
49
+ end
50
+ _connect
51
+ end
52
+
53
+ # Transaction Semantics
54
+ def begin
55
+ end
56
+
57
+ # Transaction Semantics
58
+ def commit
59
+ end
60
+
61
+ # Transaction Semantics
62
+ def rollback
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,29 @@
1
+ module RServiceBus
2
+ # AppResourceDir
3
+ class AppResourceDir < AppResource
4
+ def connect(uri)
5
+ begin
6
+ input_dir = Dir.new(uri.path)
7
+ unless File.writable?(uri.path)
8
+ puts "*** Warning. Directory is not writable, #{uri.path}."
9
+ puts "*** Warning. Make the directory, #{uri.path}, writable and try
10
+ again."
11
+ end
12
+ rescue Errno::ENOENT
13
+ puts "***** Directory does not exist, #{uri.path}."
14
+ puts "***** Create the directory, #{uri.path}, and try again."
15
+ puts "***** eg, mkdir #{uri.path}"
16
+ abort
17
+ rescue Errno::ENOTDIR
18
+ puts "***** The specified path does not point to a directory,
19
+ #{uri.path}."
20
+ puts "***** Either repoint path to a directory, or remove, #{uri.path},
21
+ and create it as a directory."
22
+ puts "***** eg, rm #{uri.path} && mkdir #{uri.path}"
23
+ abort
24
+ end
25
+
26
+ input_dir
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,8 @@
1
+ module RServiceBus
2
+ # App Resource File
3
+ class AppResourceFile < AppResource
4
+ def connect(uri)
5
+ File.new(uri.path)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,24 @@
1
+ require 'FluidDb/Db'
2
+ module RServiceBus
3
+ # Implementation of an AppResource - FluidDb
4
+ class AppResourceFluidDb < AppResource
5
+ def connect(uri)
6
+ FluidDb::Db(uri)
7
+ end
8
+
9
+ # Transaction Semantics
10
+ def begin
11
+ @connection.begin
12
+ end
13
+
14
+ # Transaction Semantics
15
+ def commit
16
+ @connection.commit
17
+ end
18
+
19
+ # Transaction Semantics
20
+ def rollback
21
+ @connection.rollback
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ require 'uri'
2
+
3
+ module RServiceBus
4
+ # Configure AppResources for an rservicebus host
5
+ class ConfigureAppResource
6
+ def get_resources(env, host, state_manager, saga_storage)
7
+ # rm = resource_manager
8
+ rm = ResourceManager.new(state_manager, saga_storage)
9
+ env.each do |k, v|
10
+ if v.is_a?(String) && k.start_with?('RSBFDB_')
11
+ uri = URI.parse(v)
12
+ require 'rservicebus/appresource/fluiddb'
13
+ rm.add k.sub('RSBFDB_', ''), AppResourceFluidDb.new(host, uri)
14
+ elsif v.is_a?(String) && k.start_with?('RSB_')
15
+ uri = URI.parse(v)
16
+ case uri.scheme
17
+ when 'dir'
18
+ require 'rservicebus/appresource/dir'
19
+ rm.add k.sub('RSB_', ''), AppResourceDir.new(host, uri)
20
+ when 'file'
21
+ require 'rservicebus/appresource/file'
22
+ rm.add k.sub('RSB_', ''), AppResourceFile.new(host, uri)
23
+ else
24
+ abort("Scheme, #{uri.scheme}, not recognised when configuring
25
+ app resource, #{k}=#{v}")
26
+ end
27
+ end
28
+ end
29
+
30
+ rm
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,28 @@
1
+ module RServiceBus
2
+ # Audit Class
3
+ class Audit
4
+ def initialize(mq)
5
+ @mq = mq
6
+ audit_queue_name = RServiceBus.get_value('AUDIT_QUEUE_NAME')
7
+ if audit_queue_name.nil?
8
+ @sent_messages_to = RServiceBus.get_value('sent_messages_to')
9
+ @received_messages_to = RServiceBus.get_value('received_messages_to')
10
+ else
11
+ @sent_messages_to = audit_queue_name
12
+ @received_messages_to = audit_queue_name
13
+ end
14
+ end
15
+
16
+ def audit_to_queue(obj)
17
+ @mq.send_msg(obj, @sent_messages_to)
18
+ end
19
+
20
+ def audit_outgoing(obj)
21
+ audit_to_queue(obj) unless @sent_messages_to.nil?
22
+ end
23
+
24
+ def audit_incoming(obj)
25
+ audit_to_queue(obj) unless @received_messages_to.nil?
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,79 @@
1
+ module RServiceBus
2
+ class MessageArrivedWhileCricuitBroken < StandardError
3
+ end
4
+
5
+ # An implementation of Michael Nygard's Circuit Breaker pattern.
6
+ class CircuitBreaker
7
+ def reset
8
+ @broken = false
9
+
10
+ @number_of_failures = 0
11
+ @time_of_first_failure = nil
12
+
13
+ @time_to_break = nil
14
+ @time_to_reset = nil
15
+ end
16
+
17
+ def initialize(host)
18
+ @host = host
19
+ @maxnumber_of_failures = RServiceBus.get_value('RSBCB_MAX', 5)
20
+ @seconds_to_break = RServiceBus.get_value('RSBCB_SECONDS_TO_BREAK', 60).to_i
21
+ @seconds_to_reset = RServiceBus.get_value('RSBCB_SECONDS_TO_RESET', 60).to_i
22
+ @reset_on_success = RServiceBus.get_value('RSBCB_RESET_ON_SUCCESS', false)
23
+
24
+ reset
25
+ end
26
+
27
+ ####### Public Interface
28
+ # Broken will be called before processing a message.
29
+ # => Broken will be called before Failure
30
+ def broken
31
+ reset if !@time_to_reset.nil? && Time.now > @time_to_reset
32
+ @broken
33
+ end
34
+
35
+ def live
36
+ !broken
37
+ end
38
+
39
+ ## This should be called less than success.
40
+ ## If there is a failure, then taking a bit longer gives time to settle.
41
+ def failure
42
+ message_arrived
43
+
44
+ ## logFirstFailure
45
+ if @number_of_failures == 0
46
+ @number_of_failures = 1
47
+ @time_of_first_failure = Time.now
48
+ @time_to_break = @time_of_first_failure + @seconds_to_break
49
+ else
50
+ @number_of_failures += 1
51
+ end
52
+
53
+ ## checkToBreakCircuit
54
+ break_circuit if @number_of_failures >= @maxnumber_of_failures
55
+ end
56
+
57
+ def success
58
+ if @reset_on_success == true
59
+ reset
60
+ return
61
+ end
62
+
63
+ message_arrived
64
+ end
65
+
66
+ protected
67
+
68
+ def message_arrived
69
+ reset if !@time_to_break.nil? && Time.now > @time_to_break
70
+
71
+ fail MessageArrivedWhileCricuitBroken if @broken == true
72
+ end
73
+
74
+ def break_circuit
75
+ @broken = true
76
+ @time_to_reset = Time.now + @seconds_to_reset
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,168 @@
1
+ module RServiceBus
2
+ # Marshals configuration information for an rservicebus host
3
+ class Config
4
+ attr_reader :app_name, :message_endpoint_mappings, :handler_path_list,
5
+ :saga_path_list, :error_queue_name, :max_retries,
6
+ :forward_received_messages_to, :subscription_uri,
7
+ :stat_output_countdown, :contract_list, :lib_list,
8
+ :forward_sent_messages_to, :mq_host
9
+
10
+ def initialize
11
+ puts 'Cannot instantiate config directly.'
12
+ puts 'For production, use ConfigFromEnv.'
13
+ puts 'For debugging or testing, you could try ConfigFromSetter'
14
+ abort
15
+ end
16
+
17
+ def log(string)
18
+ puts string
19
+ end
20
+
21
+ def get_value(name, default = nil)
22
+ value = (ENV[name].nil? || ENV[name] == '') ? default : ENV[name]
23
+ log "Env value: #{name}: #{value}"
24
+ value
25
+ end
26
+
27
+ # Marshals paths for message handlers
28
+ # Note. trailing slashs will be stripped
29
+ # Expected format: <path 1>;<path 2>
30
+ def load_handler_path_list
31
+ paths = get_value('MSGHANDLERPATH', './MessageHandler')
32
+ @handler_path_list = []
33
+ paths.split(';').each do |path|
34
+ @handler_path_list << path.strip.chomp('/')
35
+ end
36
+
37
+ self
38
+ end
39
+
40
+ def load_saga_path_list
41
+ paths = get_value('SAGAPATH', './Saga')
42
+ @saga_path_list = []
43
+ paths.split(';').each do |path|
44
+ @saga_path_list << path.strip.chomp('/')
45
+ end
46
+
47
+ self
48
+ end
49
+
50
+ def load_host_section
51
+ @app_name = get_value('APPNAME', 'RServiceBus')
52
+ @error_queue_name = get_value('ERROR_QUEUE_NAME', 'error')
53
+ @max_retries = get_value('MAX_RETRIES', '5').to_i
54
+ @stat_output_countdown = get_value('STAT_OUTPUT_COUNTDOWN', '100').to_i
55
+ @subscription_uri = get_value('SUBSCRIPTION_URI',
56
+ "file:///tmp/#{app_name}_subscriptions.yaml")
57
+
58
+ audit_queue_name = get_value('AUDIT_QUEUE_NAME')
59
+ if audit_queue_name.nil?
60
+ @forward_sent_messages_to = get_value('FORWARD_SENT_MESSAGES_TO')
61
+ @forward_received_messages_to = get_value('FORWARD_RECEIVED_MESSAGES_TO')
62
+ else
63
+ @forward_sent_messages_to = audit_queue_name
64
+ @forward_received_messages_to = audit_queue_name
65
+ end
66
+
67
+ self
68
+ end
69
+
70
+ def ensure_contract_file_exists(path)
71
+ unless File.exist?(path) || File.exist?("#{path}.rb")
72
+ puts 'Error while processing contracts'
73
+ puts "*** path, #{path}, provided does not exist as a file"
74
+ abort
75
+ end
76
+ unless File.extname(path) == '' || File.extname(path) == '.rb'
77
+ puts 'Error while processing contracts'
78
+ puts "*** path, #{path}, should point to a ruby file, with extention .rb"
79
+ abort
80
+ end
81
+ end
82
+
83
+ # Marshals paths for contracts
84
+ # Note. .rb extension is optional
85
+ # Expected format: /one/two/Contracts
86
+ def load_contracts
87
+ @contract_list = []
88
+ # This is a guard clause in case no Contracts have been specified
89
+ # If any guard clauses have been specified, then execution should drop
90
+ # to the second block
91
+ puts "Config.load_contracts, #{@contract_list}"
92
+ return self if get_value('CONTRACTS').nil?
93
+
94
+ get_value('CONTRACTS', './Contract').split(';').each do |path|
95
+ ensure_contract_file_exists(path)
96
+ @contract_list << path
97
+ end
98
+ self
99
+ end
100
+
101
+ # Marshals paths for lib
102
+ # Note. .rb extension is optional
103
+ # Expected format: /one/two/Contracts
104
+ def load_libs
105
+ @lib_list = []
106
+
107
+ paths = get_value('LIB')
108
+ paths = './lib' if paths.nil? && File.exist?('./lib')
109
+ return self if paths.nil?
110
+
111
+ paths.split(';').each do |path|
112
+ log "Loading libs from, #{path}"
113
+ unless File.exist?(path)
114
+ puts 'Error while processing libs'
115
+ puts "*** path, #{path}, should point to a ruby file, with extention
116
+ .rb, or"
117
+ puts "*** path, #{path}, should point to a directory than conatins
118
+ ruby files, that have extention .rb"
119
+ abort
120
+ end
121
+ @lib_list << path
122
+ end
123
+ self
124
+ end
125
+
126
+ def configure_mq
127
+ @mq_host = get_value('MQ', 'beanstalk://localhost')
128
+ self
129
+ end
130
+
131
+ # Marshals paths for working_dirs
132
+ # Note. trailing slashs will be stripped
133
+ # Expected format: <path 1>;<path 2>
134
+ def load_working_dir_list
135
+ puts "Config.load_working_dir_list.1"
136
+ puts "Config.load_working_dir_list.2 #{@contract_list}"
137
+ path_list = get_value('WORKING_DIR')
138
+ return self if path_list.nil?
139
+
140
+ path_list.split(';').each do |path|
141
+ path = path.strip.chomp('/')
142
+ unless Dir.exist?("#{path}")
143
+ puts 'Error while processing working directory list'
144
+ puts "*** path, #{path}, does not exist"
145
+ abort
146
+ end
147
+ @handler_path_list << "#{path}/MessageHandler" if Dir.exist?("#{path}/MessageHandler")
148
+ @saga_path_list << "#{path}/Saga" if Dir.exist?("#{path}/Saga")
149
+ @contract_list << "#{path}/Contract.rb" if File.exist?( "#{path}/Contract.rb" )
150
+ @lib_list << "#{path}/lib" if File.exist?("#{path}/lib")
151
+ end
152
+ self
153
+ end
154
+ end
155
+
156
+ # Class
157
+ class ConfigFromEnv < Config
158
+ def initialize
159
+ end
160
+ end
161
+
162
+ # Class
163
+ class ConfigFromSetter < Config
164
+ attr_writer :appName, :messageEndpointMappings, :handler_path_list, :errorQueueName, :maxRetries, :forward_received_messages_to, :beanstalkHost
165
+ def initialize
166
+ end
167
+ end
168
+ end