/*
* Copyright (c) 2008-2011 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl;
import com.emc.storageos.volumecontroller.ControllerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.bridge.SLF4JBridgeHandler;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
/**
* Use this with a spring config to start a controller service.
*/
public class Main {
private static final Logger _log = LoggerFactory.getLogger(Main.class);
private static final String SERVICE_BEAN = "controllersvc";
public static void main(String[] args) {
try {
SLF4JBridgeHandler.install();
FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(args);
ControllerService svc = (ControllerService) ctx.getBean(SERVICE_BEAN);
// set default uncaught exception handler (primarily to get thread dump on OOM error)
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(final Thread t, final Throwable e) {
try {
String errorMsg = String.format("Uncaught throwable: %s , message: %s, thread name: %s", e.getClass().getName(),
e.getMessage(), t.getName());
_log.error(errorMsg, e);
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(true, true);
StringBuilder stackTraceBuilder = new StringBuilder("Full JVM Thread Dump:\n");
for (int i = 0; i < threadInfos.length; i++) {
stackTraceBuilder.append(threadInfos[i].toString());
}
_log.error(stackTraceBuilder.toString());
} catch (Exception ex) {
_log.error("Error in default uncaught exception handler for {}:", SERVICE_BEAN, ex);
System.exit(1);
}
}
});
svc.start();
} catch (Exception e) {
_log.error("failed to start {}:", SERVICE_BEAN, e);
System.exit(1);
}
}
}