/** * */ package vnet.sms.gateway.server.serialization.minimal; import java.io.Serializable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import vnet.sms.gateway.server.framework.Context; import vnet.sms.gateway.server.framework.GatewayServerController; /** * @author obergner * */ public class Main<ID extends Serializable, TP> { private final Logger log = LoggerFactory.getLogger(getClass()); public static <ID extends Serializable, TP> void main(final String[] args) throws Exception { new Main<ID, TP>().run(); } public void run() throws Exception { this.log.info("Booting GatewayServer ..."); final ApplicationContext serverContext = loadServerContextFromClasspath(); final GatewayServerController<ID, TP> serverController = lookupGatewayServerControllerIn(serverContext); enableHangupSupportFor(serverController); serverController.start(); this.log.info("GatewayServer is up and running"); } private ApplicationContext loadServerContextFromClasspath() throws BeansException { this.log.info("Loading server context from locations [{}] ...", Context.ALL_CONTEXTS); final ApplicationContext serverContext = new ClassPathXmlApplicationContext( Context.ALL_CONTEXTS); this.log.info("Server context [{}] loaded from locations [{}]", serverContext, Context.ALL_CONTEXTS); return serverContext; } private GatewayServerController<ID, TP> lookupGatewayServerControllerIn( final ApplicationContext serverContext) throws BeansException { this.log.info( "Looking up GatewayServerController in server context [{}] ...", serverContext); final GatewayServerController<ID, TP> serverController = serverContext .getBean(GatewayServerController.class); this.log.info( "Obtained GatewayServerController [{}] from server context [{}]", serverController, serverContext); return serverController; } private void enableHangupSupportFor( final GatewayServerController<ID, TP> serverController) { this.log.info("Enabling hang up support ..."); final HangupInterceptor<ID, TP> hangupInterceptor = new HangupInterceptor<ID, TP>( serverController); Runtime.getRuntime().addShutdownHook(hangupInterceptor); this.log.info("Enabled hang up support"); } private Main() { // Noop } private static final class HangupInterceptor<ID extends Serializable, TP> extends Thread { private final Logger log = LoggerFactory .getLogger(this .getClass()); private final GatewayServerController<ID, TP> serverController; HangupInterceptor(final GatewayServerController<ID, TP> serverController) { this.serverController = serverController; } @Override public void run() { try { this.log.info( "Received hang up signal - stopping GatewayServer instance {} ...", this.serverController); this.serverController.stop(); this.log.info("GatewayServer instance {} stopped", this.serverController); } catch (final Exception ex) { this.log.warn("Error during stopping GatewayServer instance " + this.serverController, ex); } } } }