lib/celluloid/supervisor.rb in celluloid-0.5.0 vs lib/celluloid/supervisor.rb in celluloid-0.6.0
- old
+ new
@@ -2,39 +2,52 @@
# Supervisors are actors that watch over other actors and restart them if
# they crash
class Supervisor
include Celluloid
trap_exit :restart_actor
-
+
# Retrieve the actor this supervisor is supervising
attr_reader :actor
-
+
def self.supervise(klass, *args, &block)
new(nil, klass, *args, &block)
end
-
+
def self.supervise_as(name, klass, *args, &block)
new(name, klass, *args, &block)
end
-
+
def initialize(name, klass, *args, &block)
@name, @klass, @args, @block = name, klass, args, block
start_actor
end
-
- def start_actor
- @actor = @klass.new_link(*@args, &@block)
+
+ def start_actor(start_attempts = 2, sleep_interval = 30)
+ failures = 0
+
+ begin
+ @actor = @klass.new_link(*@args, &@block)
+ rescue
+ failures += 1
+ if failures >= start_attempts
+ failures = 0
+ Celluloid.logger.warn "#{@klass} is crashing on initialize repeatedly, sleeping for #{sleep_interval} seconds"
+ sleep sleep_interval
+ end
+ retry
+ end
+
Celluloid::Actor[@name] = @actor if @name
end
-
+
# When actors die, regardless of the reason, restart them
def restart_actor(actor, reason)
start_actor
end
-
+
def inspect
- str = "#<Celluloid::Supervisor(#{@klass})"
+ str = "#<#{self.class}(#{@klass}):0x#{object_id.to_s(16)}"
str << " " << @args.map { |arg| arg.inspect }.join(' ') unless @args.empty?
str << ">"
end
end
-end
\ No newline at end of file
+end