robustserver 0.0.1 → 0.0.2
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/AUTHORS +1 -0
- data/VERSION +1 -1
- data/lib/robustserver.rb +58 -2
- metadata +4 -3
data/AUTHORS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Denis Knauf <denis dot knauf at gmail dot com>
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/lib/robustserver.rb
CHANGED
@@ -4,6 +4,7 @@ def Signal.signame s
|
|
4
4
|
when String then s
|
5
5
|
when Symbol then s.to_s
|
6
6
|
when Fixnum then list.invert[s]
|
7
|
+
else raise ArgumentError, "String, Symbol or Fixnum expected, not #{s.class}"
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
@@ -12,6 +13,7 @@ def Signal.sig s
|
|
12
13
|
when Fixnum then s
|
13
14
|
when String then list[s]
|
14
15
|
when Symbol then list[s.to_s]
|
16
|
+
else raise ArgumentError, "String, Symbol or Fixnum expected, not #{s.class}"
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
@@ -25,25 +27,65 @@ def Signal.[] s
|
|
25
27
|
when String then list[s]
|
26
28
|
when Symbol then list[s.to_s]
|
27
29
|
when Fixnum then list.invert[s]
|
28
|
-
else raise ArgumentError
|
30
|
+
else raise ArgumentError, "String, Symbol or Fixnum expected, not #{s.class}"
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
34
|
+
# Description
|
35
|
+
# ===========
|
36
|
+
#
|
37
|
+
# Counts retries ot something. If the retries are to often in a short time,
|
38
|
+
# you shouldn't retry again.
|
39
|
+
#
|
40
|
+
# Examples
|
41
|
+
# ========
|
42
|
+
#
|
43
|
+
# Strings aren't Integers and 2*"Text" will raise TypeError.
|
44
|
+
#
|
45
|
+
# retries = Retry.new 5, 1
|
46
|
+
# begin
|
47
|
+
# array_of_ints_and_some_strings.each do |i|
|
48
|
+
# puts 2*i
|
49
|
+
# end
|
50
|
+
# rescue TypeError
|
51
|
+
# retries.retry? and retry
|
52
|
+
# raise $!
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
# Retry.new( 10, 30).run( ConnectionLost) do
|
56
|
+
# try_to_connect_to_db
|
57
|
+
# try_query
|
58
|
+
# end
|
32
59
|
class Retries
|
33
60
|
attr_accessor :max, :range
|
34
61
|
attr_reader :count, :last
|
35
62
|
|
63
|
+
# max: How many retries in range-time are allowed maximal.
|
64
|
+
# range: In which time-range are these retries are allowed
|
36
65
|
def initialize max = nil, range = nil
|
37
66
|
@max, @range, @count, @last = max || 10, range || 10, 0, Time.now
|
38
67
|
end
|
39
68
|
|
69
|
+
# Counts retries on every call.
|
70
|
+
# If these retries are to often - max times in range - it will return false
|
71
|
+
# else true.
|
72
|
+
# Now you can say: "I give up, to many retries, it seems it doesn't work."
|
40
73
|
def retry?
|
41
74
|
@count = @last + @range > Time.now ? @count + 1 : 1
|
42
75
|
@last = Time.now
|
43
76
|
@count < @max
|
44
77
|
end
|
45
78
|
|
46
|
-
|
79
|
+
# Automatical retrieing on raised exceptions in block.
|
80
|
+
# ex: Your expected Esception you will rescue. Default: Object, so realy everything.
|
81
|
+
#
|
82
|
+
# Example:
|
83
|
+
# Retries.new( 10, 30).run ArgumentError do something_do_which_could_raise_exception ArgumentError end
|
84
|
+
#
|
85
|
+
# This will retry maximal 10 times in 30 seconds to Call this block. But only rescues ArgumentError!
|
86
|
+
# Every other Error it will ignore and throws Exception. No retry.
|
87
|
+
def run ex = nil, &e
|
88
|
+
ex ||= Object
|
47
89
|
begin e.call *args
|
48
90
|
rescue ex
|
49
91
|
retries.retry? and retry
|
@@ -51,6 +93,16 @@ class Retries
|
|
51
93
|
end
|
52
94
|
end
|
53
95
|
|
96
|
+
# Easy problem-handler for your Server.
|
97
|
+
#
|
98
|
+
# A Server should never crash.
|
99
|
+
# If an Exception raised, which is not rescued, your program will shutdown abnormaly.
|
100
|
+
# Or if a signal tries to "kill" your program, your program will shutdown abnormaly too.
|
101
|
+
#
|
102
|
+
# With RobustServer these errors will be a more unimportant problem and It'll be easier to handle.
|
103
|
+
#
|
104
|
+
# Subclasses should implements *#run*, which will be your main-worker.
|
105
|
+
# For initializing, you can override **#initialize**, but doen't forget to call **super**.
|
54
106
|
class RobustServer
|
55
107
|
attr_reader :signals
|
56
108
|
|
@@ -92,6 +144,10 @@ class RobustServer
|
|
92
144
|
end
|
93
145
|
$stderr.puts "Unbeachtete Signale: #{@signals.map(&Signal.method(:[])).join( ', ')}"
|
94
146
|
trapping
|
147
|
+
self.at_exit
|
95
148
|
$stderr.puts "Beende mich selbst."
|
96
149
|
end
|
150
|
+
|
151
|
+
def at_exit
|
152
|
+
end
|
97
153
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Denis Knauf
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-21 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -28,6 +28,7 @@ extra_rdoc_files:
|
|
28
28
|
- LICENSE
|
29
29
|
- README.md
|
30
30
|
files:
|
31
|
+
- AUTHORS
|
31
32
|
- README.md
|
32
33
|
- VERSION
|
33
34
|
- lib/robustserver.rb
|