/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.manifoldcf.jettyrunner; import org.apache.http.client.HttpClient; import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.protocol.HttpRequestExecutor; import org.apache.http.impl.client.HttpClients; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.config.SocketConfig; import org.apache.http.HttpEntity; import org.apache.http.impl.client.DefaultRedirectStrategy; import org.apache.http.entity.ContentType; import org.apache.http.ParseException; import org.apache.http.entity.StringEntity; import org.apache.http.entity.ContentType; import org.apache.http.HttpStatus; import org.apache.http.HttpException; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.HttpResponse; import org.apache.http.util.EntityUtils; import java.nio.charset.StandardCharsets; import java.util.*; import java.io.*; import java.net.URLEncoder; import java.nio.charset.Charset; /* Shutdown jetty by posting the shutdown token * */ public class ManifoldCFJettyShutdown { public static final String _rcsid = "@(#)$Id$"; protected final String jettyBaseURL; public ManifoldCFJettyShutdown(String jettyBaseURL) { this.jettyBaseURL = jettyBaseURL; } public void shutdownJetty() throws Exception { // Pick up shutdown token String shutdownToken = System.getProperty("org.apache.manifoldcf.jettyshutdowntoken"); if (shutdownToken != null) { int socketTimeout = 900000; int connectionTimeout = 300000; PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(); poolingConnectionManager.setDefaultMaxPerRoute(1); poolingConnectionManager.setValidateAfterInactivity(60000); poolingConnectionManager.setDefaultSocketConfig(SocketConfig.custom() .setTcpNoDelay(true) .setSoTimeout(socketTimeout) .build()); HttpClientConnectionManager connectionManager = poolingConnectionManager; RequestConfig.Builder requestBuilder = RequestConfig.custom() .setCircularRedirectsAllowed(true) .setSocketTimeout(socketTimeout) .setExpectContinueEnabled(true) .setConnectTimeout(connectionTimeout) .setConnectionRequestTimeout(socketTimeout); HttpClient httpClient = HttpClients.custom() .setConnectionManager(connectionManager) .disableAutomaticRetries() .setDefaultRequestConfig(requestBuilder.build()) .setRequestExecutor(new HttpRequestExecutor(socketTimeout)) .setRedirectStrategy(new DefaultRedirectStrategy()) .build(); HttpPost method = new HttpPost(jettyBaseURL+"/shutdown?token="+URLEncoder.encode(shutdownToken,"UTF-8")); method.setEntity(new StringEntity("",ContentType.create("text/plain", StandardCharsets.UTF_8))); try { HttpResponse httpResponse = httpClient.execute(method); int resultCode = httpResponse.getStatusLine().getStatusCode(); if (resultCode != 200) throw new Exception("Received result code "+resultCode+" from POST"); } catch (org.apache.http.NoHttpResponseException e) { // This is ok and expected } } else { throw new Exception("No jetty shutdown token specified"); } } /** * A main class that sends a shutdown token to Jetty */ public static void main( String[] args ) { if (args.length != 0 && args.length != 1) { System.err.println("Usage: ManifoldCFJettyShutdown [<jetty_base_url>]"); System.exit(1); } String jettyURL; if (args.length > 0) jettyURL = args[0]; else jettyURL = "http://localhost:8345"; try { ManifoldCFJettyShutdown js = new ManifoldCFJettyShutdown(jettyURL); js.shutdownJetty(); } catch (Exception e) { e.printStackTrace(System.err); System.exit(1); } } }