lib/celluloid/supervisor.rb in celluloid-0.11.0 vs lib/celluloid/supervisor.rb in celluloid-0.11.1
- old
+ new
@@ -1,69 +1,22 @@
module Celluloid
# 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
-
class << self
# Define the root of the supervision tree
attr_accessor :root
def supervise(klass, *args, &block)
- new(nil, klass, *args, &block)
+ SupervisionGroup.new do |group|
+ group.supervise klass, *args, &block
+ end
end
def supervise_as(name, klass, *args, &block)
- new(name, klass, *args, &block)
- end
- end
-
- def initialize(name, klass, *args, &block)
- @name, @klass, @args, @block = name, klass, args, block
- @started = false
-
- start_actor
- end
-
- def finalize
- @actor.terminate if @actor and @actor.alive?
- end
-
- def start_actor(start_attempts = 3, sleep_interval = 30)
- failures = 0
-
- begin
- @actor = @klass.new_link(*@args, &@block)
- rescue
- failures += 1
- if failures >= start_attempts
- failures = 0
-
- Logger.warn("#{@klass} is crashing on initialize too quickly, sleeping for #{sleep_interval} seconds")
- sleep sleep_interval
+ SupervisionGroup.new do |group|
+ group.supervise_as name, klass, *args, &block
end
- retry
end
-
- @started = true
- Actor[@name] = @actor if @name
- end
-
- # When actors die, regardless of the reason, restart them
- def restart_actor(actor, reason)
- # If the actor we're supervising exited cleanly, exit the supervisor cleanly too
- terminate unless reason
-
- start_actor if @started
- end
-
- def inspect
- str = "#<#{self.class}(#{@klass}):0x#{object_id.to_s(16)}"
- str << " " << @args.map { |arg| arg.inspect }.join(' ') unless @args.empty?
- str << ">"
end
end
end