content: package com.taobao.yugong;
  
  import java.io.FileInputStream;
  
  import org.apache.commons.configuration.PropertiesConfiguration;
  import org.apache.commons.lang.StringUtils;
  import org.apache.commons.lang.exception.ExceptionUtils;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import com.taobao.yugong.common.version.VersionInfo;
  import com.taobao.yugong.controller.YuGongController;
  
  public class YuGongLauncher {
  
      private static final String CLASSPATH_URL_PREFIX = "classpath:";
      private static final Logger logger               = LoggerFactory.getLogger(YuGongLauncher.class);
  
      public static void main(String[] args) throws Throwable {
          try {
              String conf = System.getProperty("yugong.conf", "classpath:yugong.properties");
              PropertiesConfiguration config = new PropertiesConfiguration();
              if (conf.startsWith(CLASSPATH_URL_PREFIX)) {
                  conf = StringUtils.substringAfter(conf, CLASSPATH_URL_PREFIX);
                  config.load(YuGongLauncher.class.getClassLoader().getResourceAsStream(conf));
              } else {
                  config.load(new FileInputStream(conf));
              }
  
              logger.info("## start the YuGong.");
              final YuGongController controller = new YuGongController(config);
              controller.start();
              logger.info("## the YuGong is running now ......");
              logger.info(VersionInfo.getBuildVersion());
              Runtime.getRuntime().addShutdownHook(new Thread() {
  
                  public void run() {
                      if (controller.isStart()) {
                          try {
                              logger.info("## stop the YuGong");
                              controller.stop();
                          } catch (Throwable e) {
                              logger.warn("## something goes wrong when stopping YuGong:\n{}",
                                  ExceptionUtils.getFullStackTrace(e));
                          } finally {
                              logger.info("## YuGong is down.");
                          }
                      }
                  }
  
              });
  
              controller.waitForDone();// 如果所有都完成，则进行退出
              Thread.sleep(3 * 1000); // 等待3s，清理上下文
              logger.info("## stop the YuGong");
              if (controller.isStart()) {
                  controller.stop();
              }
              logger.info("## YuGong is down.");
          } catch (Throwable e) {
              logger.error("## Something goes wrong when starting up the YuGong:\n{}",
                  ExceptionUtils.getFullStackTrace(e));
              System.exit(0);
          }
      }
  }
  