in src/main/java/org/apache/sling/maven/kickstart/run/LauncherCallable.java [266:374]
public static void stop(final Log LOG, final ProcessDescription cfg) throws Exception {
boolean isNew = false;
if (cfg.getProcess() != null || isNew ) {
LOG.info("Stopping Kickstart '" + cfg.getId() + "'");
boolean destroy = true;
final int twoMinutes = 2 * 60 * 1000;
final File controlPortFile = getControlPortFile(cfg.getDirectory());
LOG.debug("Control port file " + controlPortFile + " exists: " + controlPortFile.exists());
if ( controlPortFile.exists() ) {
// reading control port
int controlPort = -1;
String secretKey = null;
LineNumberReader lnr = null;
String serverName = null;
try {
lnr = new LineNumberReader(new FileReader(controlPortFile));
final String portLine = lnr.readLine();
final int pos = portLine.indexOf(':');
controlPort = Integer.parseInt(portLine.substring(pos + 1));
if ( pos > 0 ) {
serverName = portLine.substring(0, pos);
}
secretKey = lnr.readLine();
} catch ( final NumberFormatException ignore) {
// we ignore this
LOG.debug("Error reading control port file " + controlPortFile, ignore);
} catch ( final IOException ignore) {
// we ignore this
LOG.debug("Error reading control port file " + controlPortFile, ignore);
} finally {
IOUtils.closeQuietly(lnr);
}
if ( controlPort != -1 ) {
final List<String> hosts = new ArrayList<String>();
if ( serverName != null ) {
hosts.add(serverName);
}
hosts.add("localhost");
hosts.add("127.0.0.1");
LOG.debug("Found control port " + controlPort);
int index = 0;
while ( destroy && index < hosts.size() ) {
final String hostName = hosts.get(index);
Socket clientSocket = null;
DataOutputStream out = null;
BufferedReader in = null;
try {
LOG.debug("Trying to connect to " + hostName + ":" + controlPort);
clientSocket = new Socket();
// set a socket timeout
clientSocket.connect(new InetSocketAddress(hostName, controlPort), twoMinutes);
// without that, read() call on the InputStream associated with this Socket is infinite
clientSocket.setSoTimeout(twoMinutes);
LOG.debug(hostName + ":" + controlPort + " connection estabilished, sending the 'stop' command...");
out = new DataOutputStream(clientSocket.getOutputStream());
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
if (secretKey != null) {
out.writeBytes(secretKey);
out.write(' ');
}
out.writeBytes("stop\n");
in.readLine();
destroy = false;
LOG.debug("'stop' command sent to " + hostName + ":" + controlPort);
} catch (final Throwable ignore) {
// catch Throwable because InetSocketAddress and Socket#connect throws unchecked exceptions
// we ignore this for now
LOG.debug("Error sending 'stop' command to " + hostName + ":" + controlPort + " due to: " + ignore.getMessage());
} finally {
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
IOUtils.closeQuietly(clientSocket);
}
index++;
}
}
}
if ( cfg.getProcess() != null ) {
final Process process = cfg.getProcess();
if (!destroy) {
LOG.debug("Waiting for process to stop...");
process.waitFor(twoMinutes, TimeUnit.MILLISECONDS);
if (process.isAlive()) {
LOG.debug("Process timeout out after 2 minutes");
destroy = true;
} else {
LOG.debug("Process stopped");
}
}
if (destroy) {
LOG.debug("Destroying process...");
process.destroy();
process.waitFor(twoMinutes, TimeUnit.MILLISECONDS);
LOG.debug("Process destroyed");
}
cfg.setProcess(null);
}
} else {
LOG.warn("Kickstart already stopped");
}
}