package org.radargun.service; /** * @author Martin Gencur */ public class TomcatServerLifecycle extends ProcessLifecycle<TomcatServerService> { public TomcatServerLifecycle(final TomcatServerService service) { super(service); } @Override public void start() { if (service.isTomcatReady()) { log.warn("Tomcat is already running"); return; } fireBeforeStart(); try { startInternal(); long timeout = service.startTimeout; boolean serverAvailable = false; while (timeout > 0 && !serverAvailable) { serverAvailable = service.isTomcatReady(); if (!serverAvailable) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } timeout -= 1000; } } if (!serverAvailable) throw new IllegalStateException("Server did not start within timeout"); log.info("Tomcat server started by RadarGun!"); } finally { fireAfterStart(); } } @Override public void stop() { if (!isRunning()) { log.warn("Tomcat is not running, cannot stop"); return; } fireBeforeStop(true); stopInternal(); log.info("Tomcat server stopped by RadarGun"); } @Override public void kill() { Runnable waiting = killAsyncInternal(); if (waiting == null) return; waiting.run(); stopReaders(); } @Override public void killAsync() { Runnable waiting = killAsyncInternal(); if (waiting == null) return; Thread listenerInvoker = new Thread(waiting, "StopListenerInvoker"); listenerInvoker.setDaemon(true); listenerInvoker.start(); synchronized (this) { outputReader = null; errorReader = null; } } private synchronized void stopReaders() { if (outputReader != null) { try { outputReader.join(60000); } catch (InterruptedException e) { log.warn("Interrupted waiting for the reader"); Thread.currentThread().interrupt(); } outputReader = null; } if (errorReader != null) { try { errorReader.join(60000); } catch (InterruptedException e) { log.warn("Interrupted waiting for the reader"); Thread.currentThread().interrupt(); } errorReader = null; } } }