sanford 0.15.1 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -2
- data/bench/config.sanford +11 -4
- data/bench/report.rb +1 -1
- data/bench/report.txt +37 -31
- data/lib/sanford/connection_handler.rb +0 -5
- data/lib/sanford/runner.rb +34 -28
- data/lib/sanford/sanford_runner.rb +5 -12
- data/lib/sanford/server.rb +57 -117
- data/lib/sanford/server_data.rb +13 -9
- data/lib/sanford/service_handler.rb +50 -23
- data/lib/sanford/test_runner.rb +30 -26
- data/lib/sanford/version.rb +1 -1
- data/lib/sanford/worker.rb +106 -0
- data/sanford.gemspec +2 -1
- data/test/support/app_server.rb +7 -4
- data/test/system/server_tests.rb +7 -3
- data/test/system/service_handler_tests.rb +1 -2
- data/test/unit/connection_handler_tests.rb +0 -16
- data/test/unit/runner_tests.rb +152 -41
- data/test/unit/sanford_runner_tests.rb +105 -63
- data/test/unit/server_data_tests.rb +34 -25
- data/test/unit/server_tests.rb +132 -210
- data/test/unit/service_handler_tests.rb +137 -64
- data/test/unit/test_runner_tests.rb +40 -101
- data/test/unit/worker_tests.rb +185 -0
- metadata +32 -15
- data/lib/sanford/test_helpers.rb +0 -19
- /data/{LICENSE.txt → LICENSE} +0 -0
data/Gemfile
CHANGED
data/bench/config.sanford
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
LOGGER = Logger.new(STDOUT)
|
2
|
+
LOGGER.datetime_format = "" # turn off the datetime in the logs
|
3
|
+
|
1
4
|
class BenchServer
|
2
5
|
include Sanford::Server
|
3
6
|
|
@@ -5,7 +8,7 @@ class BenchServer
|
|
5
8
|
port 59284
|
6
9
|
pid_file File.expand_path("../../tmp/bench_server.pid", __FILE__)
|
7
10
|
|
8
|
-
logger
|
11
|
+
logger LOGGER
|
9
12
|
verbose_logging false
|
10
13
|
|
11
14
|
router do
|
@@ -16,9 +19,13 @@ class BenchServer
|
|
16
19
|
include Sanford::ServiceHandler
|
17
20
|
|
18
21
|
def run!
|
19
|
-
{ :string
|
20
|
-
:
|
21
|
-
:
|
22
|
+
{ :string => 'test',
|
23
|
+
:int => 1,
|
24
|
+
:float => 2.1,
|
25
|
+
:boolean => true,
|
26
|
+
:hash => { :something => 'else' },
|
27
|
+
:array => [1, 2, 3],
|
28
|
+
:request_number => params['request_number']
|
22
29
|
}
|
23
30
|
end
|
24
31
|
|
data/bench/report.rb
CHANGED
@@ -81,7 +81,7 @@ module Bench
|
|
81
81
|
output " #{response.status}"
|
82
82
|
output " #{response.data.inspect}"
|
83
83
|
end
|
84
|
-
rescue
|
84
|
+
rescue StandardError => exception
|
85
85
|
puts "FAILED -> #{exception.class}: #{exception.message}"
|
86
86
|
puts exception.backtrace.join("\n")
|
87
87
|
end
|
data/bench/report.txt
CHANGED
@@ -2,40 +2,46 @@ Running benchmark report...
|
|
2
2
|
|
3
3
|
Hitting "simple" service with {}, 10000 times
|
4
4
|
....................................................................................................
|
5
|
-
Total Time:
|
6
|
-
Average Time: 0.
|
7
|
-
Min Time: 0.
|
8
|
-
Max Time:
|
5
|
+
Total Time: 7600.3550ms
|
6
|
+
Average Time: 0.7600ms
|
7
|
+
Min Time: 0.3941ms
|
8
|
+
Max Time: 38.5608ms
|
9
9
|
|
10
10
|
Distribution (number of requests):
|
11
|
-
0ms:
|
12
|
-
0.3ms:
|
13
|
-
0.4ms:
|
14
|
-
0.5ms:
|
15
|
-
0.6ms:
|
16
|
-
0.7ms:
|
17
|
-
0.8ms:
|
18
|
-
0.9ms:
|
19
|
-
1ms:
|
20
|
-
1.0ms:
|
21
|
-
1.1ms:
|
22
|
-
1.2ms:
|
23
|
-
1.3ms:
|
24
|
-
1.4ms:
|
25
|
-
1.5ms:
|
11
|
+
0ms: 9812
|
12
|
+
0.3ms: 15
|
13
|
+
0.4ms: 2030
|
14
|
+
0.5ms: 2816
|
15
|
+
0.6ms: 3236
|
16
|
+
0.7ms: 1250
|
17
|
+
0.8ms: 327
|
18
|
+
0.9ms: 138
|
19
|
+
1ms: 134
|
20
|
+
1.0ms: 60
|
21
|
+
1.1ms: 24
|
22
|
+
1.2ms: 16
|
23
|
+
1.3ms: 11
|
24
|
+
1.4ms: 5
|
25
|
+
1.5ms: 6
|
26
|
+
1.6ms: 5
|
27
|
+
1.7ms: 4
|
26
28
|
1.8ms: 2
|
27
|
-
|
28
|
-
|
29
|
+
1.9ms: 1
|
30
|
+
2ms: 4
|
31
|
+
6ms: 1
|
29
32
|
7ms: 1
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
30ms:
|
35
|
-
31ms:
|
36
|
-
32ms:
|
37
|
-
33ms:
|
38
|
-
34ms:
|
39
|
-
|
33
|
+
8ms: 1
|
34
|
+
9ms: 1
|
35
|
+
10ms: 1
|
36
|
+
28ms: 1
|
37
|
+
30ms: 5
|
38
|
+
31ms: 14
|
39
|
+
32ms: 9
|
40
|
+
33ms: 7
|
41
|
+
34ms: 4
|
42
|
+
35ms: 2
|
43
|
+
36ms: 1
|
44
|
+
37ms: 1
|
45
|
+
38ms: 1
|
40
46
|
|
41
47
|
Done running benchmark report
|
@@ -27,7 +27,6 @@ module Sanford
|
|
27
27
|
end
|
28
28
|
processed_service.time_taken = RoundedTime.new(benchmark.real)
|
29
29
|
self.log_complete(processed_service)
|
30
|
-
self.raise_if_debugging!(processed_service.exception)
|
31
30
|
processed_service
|
32
31
|
end
|
33
32
|
|
@@ -82,10 +81,6 @@ module Sanford
|
|
82
81
|
processed_service
|
83
82
|
end
|
84
83
|
|
85
|
-
def raise_if_debugging!(exception)
|
86
|
-
raise exception if exception && ENV['SANFORD_DEBUG']
|
87
|
-
end
|
88
|
-
|
89
84
|
def log_received
|
90
85
|
log_verbose "===== Received request ====="
|
91
86
|
end
|
data/lib/sanford/runner.rb
CHANGED
@@ -12,21 +12,25 @@ module Sanford
|
|
12
12
|
|
13
13
|
class Runner
|
14
14
|
|
15
|
-
|
15
|
+
DEFAULT_STATUS_CODE = 200.freeze
|
16
|
+
DEFAULT_STATUS_MSG = nil.freeze
|
17
|
+
DEFAULT_DATA = nil.freeze
|
16
18
|
|
17
19
|
attr_reader :handler_class, :handler
|
18
|
-
attr_reader :
|
20
|
+
attr_reader :logger, :router, :template_source
|
21
|
+
attr_reader :request, :params
|
19
22
|
|
20
23
|
def initialize(handler_class, args = nil)
|
21
|
-
@
|
24
|
+
@status_code, @status_msg, @data = nil, nil, nil
|
22
25
|
|
23
|
-
|
24
|
-
@
|
25
|
-
@
|
26
|
-
@
|
27
|
-
@
|
28
|
-
@
|
26
|
+
args ||= {}
|
27
|
+
@logger = args[:logger] || Sanford::NullLogger.new
|
28
|
+
@router = args[:router] || Sanford::Router.new
|
29
|
+
@template_source = args[:template_source] || Sanford::NullTemplateSource.new
|
30
|
+
@request = args[:request]
|
31
|
+
@params = args[:params] || {}
|
29
32
|
|
33
|
+
@handler_class = handler_class
|
30
34
|
@handler = @handler_class.new(self)
|
31
35
|
end
|
32
36
|
|
@@ -34,32 +38,34 @@ module Sanford
|
|
34
38
|
raise NotImplementedError
|
35
39
|
end
|
36
40
|
|
37
|
-
def
|
38
|
-
|
41
|
+
def to_response
|
42
|
+
Sanford::Protocol::Response.new(
|
43
|
+
[@status_code || DEFAULT_STATUS_CODE, @status_msg || DEFAULT_STATUS_MSG],
|
44
|
+
@data.nil? ? DEFAULT_DATA : @data
|
45
|
+
)
|
39
46
|
end
|
40
47
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
options ||= {}
|
48
|
-
message = options[:message] || options['message']
|
49
|
-
response_status = [ status, message ]
|
50
|
-
response_data = options[:data] || options['data']
|
51
|
-
throw :halt, ResponseArgs.new(response_status, response_data)
|
48
|
+
def status(*args)
|
49
|
+
if !args.empty?
|
50
|
+
@status_msg = (args.pop)[:message] if args.last.kind_of?(::Hash)
|
51
|
+
@status_code = args.first if !args.empty?
|
52
|
+
end
|
53
|
+
[@status_code, @status_msg]
|
52
54
|
end
|
53
55
|
|
54
|
-
|
56
|
+
def data(value = nil)
|
57
|
+
@data = value if !value.nil?
|
58
|
+
@data
|
59
|
+
end
|
55
60
|
|
56
|
-
def
|
57
|
-
|
61
|
+
def halt(*args)
|
62
|
+
self.status(*args)
|
63
|
+
self.data((args.pop)[:data]) if args.last.kind_of?(::Hash)
|
64
|
+
throw :halt
|
58
65
|
end
|
59
66
|
|
60
|
-
def
|
61
|
-
|
62
|
-
Sanford::Protocol::Response.new(args.status, args.data)
|
67
|
+
def render(path, locals = nil)
|
68
|
+
self.data(self.template_source.render(path, self.handler, locals || {}))
|
63
69
|
end
|
64
70
|
|
65
71
|
end
|
@@ -5,19 +5,12 @@ module Sanford
|
|
5
5
|
class SanfordRunner < Runner
|
6
6
|
|
7
7
|
def run
|
8
|
-
|
9
|
-
|
10
|
-
self.handler.
|
11
|
-
|
12
|
-
run_callbacks self.handler_class.after_callbacks
|
13
|
-
return_value
|
8
|
+
catch(:halt) do
|
9
|
+
self.handler.sanford_run_callback 'before'
|
10
|
+
catch(:halt){ self.handler.sanford_init; self.handler.sanford_run }
|
11
|
+
self.handler.sanford_run_callback 'after'
|
14
12
|
end
|
15
|
-
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def run_callbacks(callbacks)
|
20
|
-
callbacks.each{ |proc| self.handler.instance_eval(&proc) }
|
13
|
+
self.to_response
|
21
14
|
end
|
22
15
|
|
23
16
|
end
|
data/lib/sanford/server.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'dat-tcp'
|
2
|
+
require 'much-plugin'
|
2
3
|
require 'ns-options'
|
3
4
|
require 'ns-options/boolean'
|
4
5
|
require 'pathname'
|
@@ -8,17 +9,16 @@ require 'sanford/logger'
|
|
8
9
|
require 'sanford/router'
|
9
10
|
require 'sanford/server_data'
|
10
11
|
require 'sanford/template_source'
|
11
|
-
require 'sanford/
|
12
|
+
require 'sanford/worker'
|
12
13
|
|
13
14
|
module Sanford
|
14
15
|
|
15
16
|
module Server
|
17
|
+
include MuchPlugin
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
include InstanceMethods
|
21
|
-
end
|
19
|
+
plugin_included do
|
20
|
+
extend ClassMethods
|
21
|
+
include InstanceMethods
|
22
22
|
end
|
23
23
|
|
24
24
|
module InstanceMethods
|
@@ -28,7 +28,14 @@ module Sanford
|
|
28
28
|
def initialize
|
29
29
|
self.class.configuration.validate!
|
30
30
|
@server_data = ServerData.new(self.class.configuration.to_hash)
|
31
|
-
@dat_tcp_server =
|
31
|
+
@dat_tcp_server = DatTCP::Server.new(self.server_data.worker_class, {
|
32
|
+
:num_workers => self.server_data.num_workers,
|
33
|
+
:logger => self.server_data.dtcp_logger,
|
34
|
+
:shutdown_timeout => self.server_data.shutdown_timeout,
|
35
|
+
:worker_params => self.server_data.worker_params.merge({
|
36
|
+
:sanford_server_data => self.server_data
|
37
|
+
})
|
38
|
+
})
|
32
39
|
rescue InvalidError => exception
|
33
40
|
exception.set_backtrace(caller)
|
34
41
|
raise exception
|
@@ -109,34 +116,10 @@ module Sanford
|
|
109
116
|
|
110
117
|
private
|
111
118
|
|
112
|
-
def build_dat_tcp_server
|
113
|
-
s = DatTCP::Server.new{ |socket| serve(socket) }
|
114
|
-
|
115
|
-
# add any configured callbacks
|
116
|
-
self.server_data.worker_start_procs.each{ |p| s.on_worker_start(&p) }
|
117
|
-
self.server_data.worker_shutdown_procs.each{ |p| s.on_worker_shutdown(&p) }
|
118
|
-
self.server_data.worker_sleep_procs.each{ |p| s.on_worker_sleep(&p) }
|
119
|
-
self.server_data.worker_wakeup_procs.each{ |p| s.on_worker_wakeup(&p) }
|
120
|
-
|
121
|
-
s
|
122
|
-
end
|
123
|
-
|
124
|
-
def serve(socket)
|
125
|
-
connection = Connection.new(socket)
|
126
|
-
if !keep_alive_connection?(connection)
|
127
|
-
Sanford::ConnectionHandler.new(@server_data, connection).run
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
def keep_alive_connection?(connection)
|
132
|
-
@server_data.receives_keep_alive && connection.peek_data.empty?
|
133
|
-
end
|
134
|
-
|
135
119
|
# TCP_NODELAY is set to disable buffering. In the case of Sanford
|
136
120
|
# communication, we have all the information we need to send up front and
|
137
121
|
# are closing the connection, so it doesn't need to buffer.
|
138
122
|
# See http://linux.die.net/man/7/tcp
|
139
|
-
|
140
123
|
def configure_tcp_server(tcp_server)
|
141
124
|
tcp_server.setsockopt(::Socket::IPPROTO_TCP, ::Socket::TCP_NODELAY, true)
|
142
125
|
end
|
@@ -165,6 +148,22 @@ module Sanford
|
|
165
148
|
self.configuration.pid_file *args
|
166
149
|
end
|
167
150
|
|
151
|
+
def worker_class(new_worker_class = nil)
|
152
|
+
self.configuration.worker_class = new_worker_class if new_worker_class
|
153
|
+
self.configuration.worker_class
|
154
|
+
end
|
155
|
+
|
156
|
+
def worker_params(new_worker_params = nil)
|
157
|
+
self.configuration.worker_params = new_worker_params if new_worker_params
|
158
|
+
self.configuration.worker_params
|
159
|
+
end
|
160
|
+
|
161
|
+
def num_workers(new_num_workers = nil)
|
162
|
+
self.configuration.num_workers = new_num_workers if new_num_workers
|
163
|
+
self.configuration.num_workers
|
164
|
+
end
|
165
|
+
alias :workers :num_workers
|
166
|
+
|
168
167
|
def receives_keep_alive(*args)
|
169
168
|
self.configuration.receives_keep_alive *args
|
170
169
|
end
|
@@ -177,6 +176,11 @@ module Sanford
|
|
177
176
|
self.configuration.logger *args
|
178
177
|
end
|
179
178
|
|
179
|
+
def shutdown_timeout(new_timeout = nil)
|
180
|
+
self.configuration.shutdown_timeout = new_timeout if new_timeout
|
181
|
+
self.configuration.shutdown_timeout
|
182
|
+
end
|
183
|
+
|
180
184
|
def init(&block)
|
181
185
|
self.configuration.init_procs << block
|
182
186
|
end
|
@@ -185,22 +189,6 @@ module Sanford
|
|
185
189
|
self.configuration.error_procs << block
|
186
190
|
end
|
187
191
|
|
188
|
-
def on_worker_start(&block)
|
189
|
-
self.configuration.worker_start_procs << block
|
190
|
-
end
|
191
|
-
|
192
|
-
def on_worker_shutdown(&block)
|
193
|
-
self.configuration.worker_shutdown_procs << block
|
194
|
-
end
|
195
|
-
|
196
|
-
def on_worker_sleep(&block)
|
197
|
-
self.configuration.worker_sleep_procs << block
|
198
|
-
end
|
199
|
-
|
200
|
-
def on_worker_wakeup(&block)
|
201
|
-
self.configuration.worker_wakeup_procs << block
|
202
|
-
end
|
203
|
-
|
204
192
|
def router(value = nil, &block)
|
205
193
|
self.configuration.router = value if !value.nil?
|
206
194
|
self.configuration.router.instance_eval(&block) if block
|
@@ -213,66 +201,11 @@ module Sanford
|
|
213
201
|
|
214
202
|
end
|
215
203
|
|
216
|
-
class Connection
|
217
|
-
DEFAULT_TIMEOUT = 1
|
218
|
-
|
219
|
-
attr_reader :timeout
|
220
|
-
|
221
|
-
def initialize(socket)
|
222
|
-
@socket = socket
|
223
|
-
@connection = Sanford::Protocol::Connection.new(@socket)
|
224
|
-
@timeout = (ENV['SANFORD_TIMEOUT'] || DEFAULT_TIMEOUT).to_f
|
225
|
-
end
|
226
|
-
|
227
|
-
def read_data
|
228
|
-
@connection.read(@timeout)
|
229
|
-
end
|
230
|
-
|
231
|
-
def write_data(data)
|
232
|
-
TCPCork.apply(@socket)
|
233
|
-
@connection.write data
|
234
|
-
TCPCork.remove(@socket)
|
235
|
-
end
|
236
|
-
|
237
|
-
def peek_data
|
238
|
-
@connection.peek(@timeout)
|
239
|
-
end
|
240
|
-
|
241
|
-
def close_write
|
242
|
-
@connection.close_write
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
|
-
module TCPCork
|
247
|
-
# On Linux, use TCP_CORK to better control how the TCP stack
|
248
|
-
# packetizes our stream. This improves both latency and throughput.
|
249
|
-
# TCP_CORK disables Nagle's algorithm, which is ideal for sporadic
|
250
|
-
# traffic (like Telnet) but is less optimal for HTTP. Sanford is similar
|
251
|
-
# to HTTP, it doesn't receive sporadic packets, it has all its data
|
252
|
-
# come in at once.
|
253
|
-
# For more information: http://baus.net/on-tcp_cork
|
254
|
-
|
255
|
-
if RUBY_PLATFORM =~ /linux/
|
256
|
-
# 3 == TCP_CORK
|
257
|
-
def self.apply(socket)
|
258
|
-
socket.setsockopt(::Socket::IPPROTO_TCP, 3, true)
|
259
|
-
end
|
260
|
-
|
261
|
-
def self.remove(socket)
|
262
|
-
socket.setsockopt(::Socket::IPPROTO_TCP, 3, false)
|
263
|
-
end
|
264
|
-
else
|
265
|
-
def self.apply(socket)
|
266
|
-
end
|
267
|
-
|
268
|
-
def self.remove(socket)
|
269
|
-
end
|
270
|
-
end
|
271
|
-
end
|
272
|
-
|
273
204
|
class Configuration
|
274
205
|
include NsOptions::Proxy
|
275
206
|
|
207
|
+
DEFAULT_NUM_WORKERS = 4
|
208
|
+
|
276
209
|
option :name, String, :required => true
|
277
210
|
option :ip, String, :required => true, :default => '0.0.0.0'
|
278
211
|
option :port, Integer, :required => true
|
@@ -285,16 +218,18 @@ module Sanford
|
|
285
218
|
option :template_source, :default => proc{ NullTemplateSource.new }
|
286
219
|
|
287
220
|
attr_accessor :init_procs, :error_procs
|
221
|
+
attr_accessor :worker_class, :worker_params, :num_workers
|
222
|
+
attr_accessor :shutdown_timeout
|
288
223
|
attr_accessor :router
|
289
|
-
attr_reader :worker_start_procs, :worker_shutdown_procs
|
290
|
-
attr_reader :worker_sleep_procs, :worker_wakeup_procs
|
291
224
|
|
292
225
|
def initialize(values = nil)
|
293
226
|
super(values)
|
294
227
|
@init_procs, @error_procs = [], []
|
295
|
-
@
|
296
|
-
@
|
297
|
-
@
|
228
|
+
@worker_class = DefaultWorker
|
229
|
+
@worker_params = nil
|
230
|
+
@num_workers = DEFAULT_NUM_WORKERS
|
231
|
+
@shutdown_timeout = nil
|
232
|
+
@router = Sanford::Router.new
|
298
233
|
@valid = nil
|
299
234
|
end
|
300
235
|
|
@@ -304,14 +239,14 @@ module Sanford
|
|
304
239
|
|
305
240
|
def to_hash
|
306
241
|
super.merge({
|
307
|
-
:init_procs
|
308
|
-
:error_procs
|
309
|
-
:
|
310
|
-
:
|
311
|
-
:
|
312
|
-
:
|
313
|
-
:router
|
314
|
-
:routes
|
242
|
+
:init_procs => self.init_procs,
|
243
|
+
:error_procs => self.error_procs,
|
244
|
+
:worker_class => self.worker_class,
|
245
|
+
:worker_params => self.worker_params,
|
246
|
+
:num_workers => self.num_workers,
|
247
|
+
:shutdown_timeout => self.shutdown_timeout,
|
248
|
+
:router => self.router,
|
249
|
+
:routes => self.routes
|
315
250
|
})
|
316
251
|
end
|
317
252
|
|
@@ -325,11 +260,16 @@ module Sanford
|
|
325
260
|
if !self.required_set?
|
326
261
|
raise InvalidError, "a name, ip and port must be configured"
|
327
262
|
end
|
263
|
+
if !self.worker_class.kind_of?(Class) || !self.worker_class.include?(Sanford::Worker)
|
264
|
+
raise InvalidError, "worker class must include `#{Sanford::Worker}`"
|
265
|
+
end
|
328
266
|
self.routes.each(&:validate!)
|
329
267
|
@valid = true
|
330
268
|
end
|
331
269
|
end
|
332
270
|
|
271
|
+
DefaultWorker = Class.new{ include Sanford::Worker }
|
272
|
+
|
333
273
|
InvalidError = Class.new(RuntimeError)
|
334
274
|
|
335
275
|
end
|
data/lib/sanford/server_data.rb
CHANGED
@@ -10,10 +10,10 @@ module Sanford
|
|
10
10
|
attr_reader :name
|
11
11
|
attr_reader :pid_file
|
12
12
|
attr_reader :receives_keep_alive
|
13
|
-
attr_reader :
|
13
|
+
attr_reader :worker_class, :worker_params, :num_workers
|
14
|
+
attr_reader :debug, :logger, :dtcp_logger, :verbose_logging
|
15
|
+
attr_reader :template_source, :shutdown_timeout
|
14
16
|
attr_reader :init_procs, :error_procs
|
15
|
-
attr_reader :worker_start_procs, :worker_shutdown_procs
|
16
|
-
attr_reader :worker_sleep_procs, :worker_wakeup_procs
|
17
17
|
attr_reader :router, :routes
|
18
18
|
attr_accessor :ip, :port
|
19
19
|
|
@@ -26,18 +26,22 @@ module Sanford
|
|
26
26
|
|
27
27
|
@receives_keep_alive = !!args[:receives_keep_alive]
|
28
28
|
|
29
|
-
@
|
29
|
+
@worker_class = args[:worker_class]
|
30
|
+
@worker_params = args[:worker_params] || {}
|
31
|
+
@num_workers = args[:num_workers]
|
32
|
+
|
33
|
+
@debug = !ENV['SANFORD_DEBUG'].to_s.empty?
|
30
34
|
@logger = args[:logger]
|
35
|
+
@dtcp_logger = @logger if @debug
|
36
|
+
@verbose_logging = !!args[:verbose_logging]
|
37
|
+
|
31
38
|
@template_source = args[:template_source]
|
32
39
|
|
40
|
+
@shutdown_timeout = args[:shutdown_timeout]
|
41
|
+
|
33
42
|
@init_procs = args[:init_procs] || []
|
34
43
|
@error_procs = args[:error_procs] || []
|
35
44
|
|
36
|
-
@worker_start_procs = args[:worker_start_procs]
|
37
|
-
@worker_shutdown_procs = args[:worker_shutdown_procs]
|
38
|
-
@worker_sleep_procs = args[:worker_sleep_procs]
|
39
|
-
@worker_wakeup_procs = args[:worker_wakeup_procs]
|
40
|
-
|
41
45
|
@router = args[:router]
|
42
46
|
@routes = build_routes(args[:routes] || [])
|
43
47
|
end
|