blob: 5724ad131e547c6249cd18249731d68ccbac371c [file] [log] [blame]
/**
* 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.atlas.web.service;
import org.apache.atlas.AtlasConfiguration;
import org.apache.atlas.AtlasErrorCode;
import org.apache.atlas.exception.AtlasBaseException;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.util.thread.ExecutorThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
/**
* This class embeds a Jetty server and a connector.
*/
public class EmbeddedServer {
public static final Logger LOG = LoggerFactory.getLogger(EmbeddedServer.class);
protected final Server server;
public EmbeddedServer(int port, String path) throws IOException {
int queueSize = AtlasConfiguration.WEBSERVER_QUEUE_SIZE.getInt();
LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(queueSize);
int minThreads = AtlasConfiguration.WEBSERVER_MIN_THREADS.getInt();
int maxThreads = AtlasConfiguration.WEBSERVER_MAX_THREADS.getInt();
long keepAliveTime = AtlasConfiguration.WEBSERVER_KEEPALIVE_SECONDS.getLong();
ExecutorThreadPool pool =
new ExecutorThreadPool(minThreads, maxThreads, keepAliveTime, TimeUnit.SECONDS, queue);
server = new Server();
server.setThreadPool(pool);
Connector connector = getConnector(port);
server.addConnector(connector);
WebAppContext application = getWebAppContext(path);
server.setHandler(application);
}
protected WebAppContext getWebAppContext(String path) {
WebAppContext application = new WebAppContext(path, "/");
application.setClassLoader(Thread.currentThread().getContextClassLoader());
// Disable directory listing
application.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
return application;
}
public static EmbeddedServer newServer(int port, String path, boolean secure) throws IOException {
if (secure) {
return new SecureEmbeddedServer(port, path);
} else {
return new EmbeddedServer(port, path);
}
}
protected Connector getConnector(int port) throws IOException {
final int bufferSize = AtlasConfiguration.WEBSERVER_REQUEST_BUFFER_SIZE.getInt();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(port);
connector.setResponseBufferSize(bufferSize);
connector.setRequestBufferSize(bufferSize);
return connector;
}
public void start() throws AtlasBaseException {
try {
server.start();
server.join();
} catch(Exception e) {
throw new AtlasBaseException(AtlasErrorCode.EMBEDDED_SERVER_START, e);
}
}
public void stop() {
try {
server.stop();
} catch (Exception e) {
LOG.warn("Error during shutdown", e);
}
}
}