class ComponentHost::Host

Constants

Component

Public Class Methods

build() click to toggle source
# File lib/component_host/host.rb, line 9
def self.build
  instance = new
  Signal.configure instance
  instance.send = Actor::Messaging::Send
  instance
end

Public Instance Methods

abort() click to toggle source
# File lib/component_host/host.rb, line 117
def abort
  raise StopIteration
end
components() click to toggle source
# File lib/component_host/host.rb, line 113
def components
  @components ||= []
end
log_observer() click to toggle source
# File lib/component_host/host.rb, line 109
def log_observer
  @log_observer ||= SupervisorObservers::Log.new
end
record_error(&block) click to toggle source
# File lib/component_host/host.rb, line 30
def record_error(&block)
  record_errors_observer.record_error_proc = block
end
record_errors_observer() click to toggle source
# File lib/component_host/host.rb, line 105
def record_errors_observer
  @record_errors_observer ||= SupervisorObservers::RecordErrors.new
end
register(initiator, name=nil) { || ... } click to toggle source
# File lib/component_host/host.rb, line 16
def register(initiator, name=nil, &block)
  initiator ||= proc { yield }

  logger.trace(tag: :component_host) { "Registering component (Component Initiator: #{initiator}, Name: #{name || '(none)'})" }

  component = Component.new initiator, name

  components << component

  logger.debug(tag: :component_host) { "Registered component (Component Initiator: #{initiator}, Name: #{name || '(none)'})" }

  component
end
registered?(&block) click to toggle source
# File lib/component_host/host.rb, line 121
def registered?(&block)
  block ||= proc { true }

  components.any? do |component|
    block.(component.initiator, component.name)
  end
end
start(&probe) click to toggle source
# File lib/component_host/host.rb, line 34
def start(&probe)
  started_components = []

  Actor::Supervisor.start do |supervisor|
    supervisor.add_observer record_errors_observer

    supervisor.add_observer log_observer

    signal.trap 'TSTP' do
      message = Actor::Messages::Suspend

      send.(message, supervisor.address)

      logger.info(tags: [:*, :signal]) { "Handled TSTP signal (Message Name: #{message.message_name}, SupervisorAddress: #{supervisor.address.id})" }
    end

    signal.trap 'CONT' do
      message = Actor::Messages::Resume

      send.(message, supervisor.address)

      logger.info(tags: [:*, :signal]) { "Handled CONT signal (Message Name: #{message.message_name}, SupervisorAddress: #{supervisor.address.id})" }
    end

    signal.trap 'INT' do
      message = Actor::Messages::Shutdown

      send.(message, supervisor.address)

      logger.info(tags: [:*, :signal]) { "Handled INT signal (Message Name: #{message.message_name}, SupervisorAddress: #{supervisor.address.id})" }
    end

    signal.trap 'TERM' do
      message = Actor::Messages::Shutdown

      send.(message, supervisor.address)

      logger.info(tags: [:*, :signal]) { "Handled TERM signal (Message Name: #{message.message_name}, SupervisorAddress: #{supervisor.address.id})" }
    end

    start_components do |component|
      started_components << component
    end

    probe.(supervisor) if probe
  end

  started_components
end
start_components(&block) click to toggle source
# File lib/component_host/host.rb, line 84
def start_components(&block)
  components.each do |component|
    if ComponentHost::Defaults.startup_info?
      STDOUT.puts "  Component: #{component.initiator} (Name: #{component.name || '(none)'})"
    end

    logger.trace(tags: [:component_host, :start]) { "Starting component: #{component.initiator} (Name: #{component.name || '(none)'})" }

    component.start

    logger.info(tags: [:component_host, :start]) { "Started component: #{component.initiator} (Name: #{component.name || '(none)'})" }

    block.(component) if block
  end

rescue => error
  record_errors_observer.(error)
  logger.fatal(tags: [:*, :component_host, :start]) { "#{error.message} (Error: #{error.class})" }
  raise error
end