package com.intrbiz.bergamot.worker; import java.io.File; import java.io.FileInputStream; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Level; import org.apache.log4j.Logger; import com.intrbiz.Util; import com.intrbiz.accounting.AccountingManager; import com.intrbiz.bergamot.accounting.BergamotAccountingQueueConsumer; import com.intrbiz.bergamot.accounting.consumer.BergamotLoggingConsumer; import com.intrbiz.bergamot.config.LoggingCfg; import com.intrbiz.bergamot.config.WorkerCfg; import com.intrbiz.bergamot.health.HealthAgent; import com.intrbiz.configuration.Configuration; import com.intrbiz.queue.QueueManager; import com.intrbiz.queue.rabbit.RabbitPool; public class DefaultWorker extends AbstractWorker { protected final Class<? extends WorkerCfg> configurationClass; protected final String defaultConfigFile; protected final String daemonName; public DefaultWorker(Class<? extends WorkerCfg> configurationClass, String defaultConfigFile, String daemonName) { super(); this.configurationClass = configurationClass; this.defaultConfigFile = defaultConfigFile; this.daemonName = daemonName; } @Override public String getDaemonName() { return this.daemonName; } protected void configureLogging(LoggingCfg config) throws Exception { if (config == null) config = new LoggingCfg(); // configure logging to terminal BasicConfigurator.configure(); Logger.getRootLogger().setLevel(Level.toLevel(Util.coalesceEmpty(config.getLevel(), "info").toUpperCase())); } /** * Search for the configuration file */ protected File getConfigurationFile() { return new File(Util.coalesceEmpty(System.getProperty("bergamot.config"), System.getenv("bergamot_config"), System.getenv("BERGAMOT_CONFIG"), this.defaultConfigFile)); } protected WorkerCfg loadConfiguration() throws Exception { WorkerCfg config = null; // try the config file? File configFile = this.getConfigurationFile(); if (configFile.exists()) { System.out.println("Using configuration file " + configFile.getAbsolutePath()); config = Configuration.read(this.configurationClass, new FileInputStream(configFile)); } else { config = this.configurationClass.newInstance(); } config.applyDefaults(); return config; } @Override public void start() throws Exception { // load the config WorkerCfg config = this.loadConfiguration(); // setup logging this.configureLogging(config.getLogging()); Logger logger = Logger.getLogger(Worker.class); logger.debug("Bergamot worker, using configuration:\r\n" + config.toString()); // setup the queue broker QueueManager.getInstance().registerDefaultBroker(new RabbitPool(config.getBroker().getUrl(), config.getBroker().getUsername(), config.getBroker().getPassword())); // setup accounting AccountingManager.getInstance().registerConsumer("logger", new BergamotLoggingConsumer()); AccountingManager.getInstance().registerConsumer("queue", new BergamotAccountingQueueConsumer()); AccountingManager.getInstance().bindRootConsumer("logger"); AccountingManager.getInstance().bindRootConsumer("queue"); // configure the worker this.configure(config); // go go go logger.info("Bergamot worker starting."); // start the health agent HealthAgent.getInstance().init("worker", this.getDaemonName()); // start the actual worker super.start(); } }