class Bipbip::Agent
Constants
- PLUGIN_RESPAWN_DELAY
Attributes
plugins[RW]
storages[RW]
threads[RW]
Public Class Methods
new(config)
click to toggle source
@param [Bipbip::Config] config
# File lib/bipbip/agent.rb, line 12 def initialize(config) @plugins = config.plugins @storages = config.storages Bipbip.logger = config.logger @threads = [] end
Public Instance Methods
run()
click to toggle source
# File lib/bipbip/agent.rb, line 20 def run Bipbip.logger.info 'Startup...' Bipbip.logger.warn 'No storages configured' if @storages.empty? raise 'No services configured' if @plugins.empty? @storages.each do |storage| @plugins.each do |plugin| Bipbip.logger.info "Setting up plugin #{plugin.name} for storage #{storage.name}" begin storage.setup_plugin(plugin) rescue => e Bipbip.logger.fatal "Failed to setup plugin #{plugin.name} for storage #{storage.name}: `#{e.message}`. Retrying..." sleep 5 retry end end end @plugins.each do |plugin| Bipbip.logger.info "Starting plugin #{plugin.name} with config #{plugin.config}" start_plugin(plugin, @storages) end loop do thread = ThreadsWait.new(@threads).next_wait @threads.delete(thread) plugin = thread['plugin'] Bipbip.logger.error "Plugin #{plugin.name} with config #{plugin.config} terminated. Restarting..." interruptible_sleep(PLUGIN_RESPAWN_DELAY) # Re-instantiate plugin to get rid of existing database-connections etc plugin_new = Bipbip::Plugin.factory_from_plugin(plugin) @plugins.delete(plugin) @plugins.push(plugin_new) start_plugin(plugin_new, @storages) end end
Private Instance Methods
start_plugin(plugin, storages)
click to toggle source
@param [Bipbip::Plugin] plugin @param [Array<Bipbip::Storage>] storages
# File lib/bipbip/agent.rb, line 64 def start_plugin(plugin, storages) thread = Thread.new { plugin.run(storages) } thread['plugin'] = plugin @threads.push(thread) end