class Celluloid::Supervision::Container

Attributes

registry[RW]

Public Class Methods

blocks() click to toggle source

Actors or sub-applications to be supervised

# File lib/celluloid/supervision/container.rb, line 28
def blocks
  @blocks ||= []
end
define(options) click to toggle source
# File lib/celluloid/supervision/container.rb, line 10
def define(options)
  Configuration.define(top(options))
end
deploy(options) click to toggle source
# File lib/celluloid/supervision/container.rb, line 14
def deploy(options)
  Configuration.deploy(top(options))
end
new(options = {}) { |current_actor| ... } click to toggle source

Start the container.

# File lib/celluloid/supervision/container.rb, line 60
def initialize(options = {})
  options = { registry: options } if options.is_a? Internals::Registry
  @state = :initializing
  @actors = [] # instances in the container
  @registry = options.delete(:registry) || Celluloid.actor_system.registry
  @branch = options.delete(:branch) || :services
  yield current_actor if block_given?
end
pool(klass, config, &block) click to toggle source

Register a pool of actors to be launched on group startup

# File lib/celluloid/supervision/container/behavior/pool.rb, line 39
def pool(klass, config, &block)
  blocks << lambda do |container|
    container.pool(klass, config, &block)
  end
end
run(options = {}) click to toggle source

Run the application in the foreground with a simple watchdog

# File lib/celluloid/supervision/container.rb, line 43
def run(options = {})
  loop do
    supervisor = run!(options)

    # Take five, toplevel supervisor
    sleep 5 while supervisor.alive? # Why 5?

    Internals::Logger.error "!!! Celluloid::Supervision::Container #{self} crashed. Restarting..."
  end
end
run!(options = {}) click to toggle source

Start this application (and watch it with a supervisor)

# File lib/celluloid/supervision/container.rb, line 33
def run!(options = {})
  container = new(options) do |g|
    blocks.each do |block|
      block.call(g)
    end
  end
  container
end
supervise(config, &block) click to toggle source
# File lib/celluloid/supervision/supervise.rb, line 23
def supervise(config, &block)
  blocks << lambda do |container|
    container.add(config, &block)
  end
end
top(options) click to toggle source
# File lib/celluloid/supervision/container.rb, line 18
def top(options)
  {
    as: options.delete(:as),
    type: (options.delete(:type) || self),
    branch: (options.delete(:branch) || :services),
    supervise: options.delete(:supervise) || []
  }
end

Public Instance Methods

[](actor_name) click to toggle source
# File lib/celluloid/supervision/container.rb, line 109
def [](actor_name)
  @registry[actor_name]
end
actors() click to toggle source
# File lib/celluloid/supervision/container.rb, line 99
def actors
  @actors.map(&:actor)
end
add(configuration) click to toggle source
# File lib/celluloid/supervision/container.rb, line 71
def add(configuration)
  Configuration.valid?(configuration, true)
  @actors << Instance.new(configuration.merge(registry: @registry, branch: @branch))
  @state = :running
  add_accessors configuration
  Actor.current
end
add_accessors(configuration) click to toggle source
# File lib/celluloid/supervision/container.rb, line 79
def add_accessors(configuration)
  if configuration[:as]
    unless methods.include? configuration[:as]
      self.class.instance_eval do
        define_method(configuration[:as]) do
          @registry[configuration[:as]]
        end
      end
    end
  end
end
find(actor) click to toggle source
# File lib/celluloid/supervision/container.rb, line 103
def find(actor)
  @actors.find do |instance|
    instance.actor == actor
  end
end
pool(klass, config = {}, &block) click to toggle source
# File lib/celluloid/supervision/container/behavior/pool.rb, line 28
def pool(klass, config = {}, &block)
  _ = supervise(pooling_options(config, block: block, actors: klass))
  _.actors.last
end
remove(actor) click to toggle source
# File lib/celluloid/supervision/container.rb, line 93
def remove(actor)
  actor = Celluloid::Actor[actor] if actor.is_a? Symbol
  instance = find(actor)
  instance.terminate if instance
end
remove_accessors() click to toggle source
# File lib/celluloid/supervision/container.rb, line 91
def remove_accessors; end
restart_actor(actor, reason) click to toggle source

Restart a crashed actor

# File lib/celluloid/supervision/container.rb, line 114
def restart_actor(actor, reason)
  return if @state == :shutdown
  instance = find(actor)
  raise "a container instance went missing. This shouldn't be!" unless instance

  if reason
    exclusive { instance.restart }
  else
    instance.cleanup
    @actors.delete(instance)
  end
end
shutdown() click to toggle source
# File lib/celluloid/supervision/container.rb, line 127
def shutdown
  @state = :shutdown
  finalize
end
supervise(config, &block) click to toggle source
# File lib/celluloid/supervision/supervise.rb, line 29
def supervise(config, &block)
  add(Configuration.options(config, block: block))
end

Private Instance Methods

finalize() click to toggle source
# File lib/celluloid/supervision/container.rb, line 134
def finalize
  if @actors
    @actors.reverse_each do |instance|
      instance.terminate
      @actors.delete(instance)
    end
  end
end