package cse308.swift.server.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.log4j.Logger; import cse308.swift.server.thread.*; public class LaunchContextListener implements ServletContextListener { static Logger logger = Logger.getLogger(LaunchContextListener.class.getName()); private SwiftThread st = null; /** * Initializes this listener when this war's context is initialized */ public void contextInitialized(ServletContextEvent sce) { try { if ( (st == null) || (!st.isAlive()) ) { LimitOrderRuntime lor = new LimitOrderRuntime(); this.st = new SwiftThread(lor); st.start(); } else { st.gracefulStop(); st.join(2000); } } catch(Exception e) { logger.warn("Unable to properly load LimitOrder_Thread! " + e.getMessage() + " --cause " + e.getCause()); e.printStackTrace(); } } /** * When this war is destroyed/stopped, stop the thread. */ public void contextDestroyed(ServletContextEvent sce) { try { boolean success = st.gracefulStop(); logger.info("Waiting for LimitOrder_Thread to complete (5 seconds) "); st.join(5000); if (success) { logger.info("LimitOrder_Thread is sleeping, forcing interrupt "); st.interrupt(); } else { logger.fatal("LimitOrder_Thread could not be gracefully exited, Killing "); st.stop(); } } catch (Exception e) { logger.warn("Unable to properly release LimitOrder_Thread! " + e.getMessage() + " --cause " + e.getCause()); e.printStackTrace(); } } }