class ProcessHost::Host

Constants

NameConflictError

Public Class Methods

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

Public Instance Methods

log_observer() click to toggle source
# File lib/process_host/host.rb, line 99
def log_observer
  @log_observer ||= SupervisorObservers::Log.new
end
processes() click to toggle source
# File lib/process_host/host.rb, line 103
def processes
  @processes ||= {}
end
record_error(&block) click to toggle source
# File lib/process_host/host.rb, line 35
def record_error(&block)
  record_errors_observer.record_error_proc = block
end
record_errors_observer() click to toggle source
# File lib/process_host/host.rb, line 95
def record_errors_observer
  @record_errors_observer ||= SupervisorObservers::RecordErrors.new
end
register(process_class, process_name=nil) click to toggle source
# File lib/process_host/host.rb, line 15
def register(process_class, process_name=nil)
  logger.trace { "Registering process (ProcessClass: #{process_class}, Name: #{process_name.inspect})" }

  process_name ||= process_class.process_name

  if registered_process = processes[process_name]
    error_message = "Process with specified name is already registered (ProcessClass: #{process_class}, Name: #{process_name.inspect}, RegisteredProcessClass: #{registered_process.name})"

    logger.error error_message

    raise NameConflictError, error_message
  else
    processes[process_name] = process_class
  end

  logger.debug { "Process registered (ProcessClass: #{process_class}, Name: #{process_name.inspect})" }

  process_name
end
start(&block) click to toggle source
# File lib/process_host/host.rb, line 39
def start(&block)
  started_processes = []

  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 { "Handled TSTP signal (MessageName: #{message.message_name}, SupervisorAddress: #{supervisor.address.id})" }
    end

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

      send.(message, supervisor.address)

      logger.info { "Handled CONT signal (MessageName: #{message.message_name}, SupervisorAddress: #{supervisor.address.id})" }
    end

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

      send.(message, supervisor.address)

      logger.info { "Handled INT signal (MessageName: #{message.message_name}, SupervisorAddress: #{supervisor.address.id})" }
    end

    start_processes do |process|
      started_processes << process
    end

    block.(supervisor) if block
  end

  started_processes
end
start_processes(&block) click to toggle source
# File lib/process_host/host.rb, line 81
def start_processes(&block)
  processes.each_value do |process_class|
    process = process_class.build

    process.start

    block.(process) if block
  end

rescue => error
  record_errors_observer.(error)
  raise error
end