package com.iflytek.edu.cloud.oauth2.jetty;
import io.netty.util.internal.SystemPropertyUtil;
import java.io.File;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.FragmentConfiguration;
import org.eclipse.jetty.webapp.JettyWebXmlConfiguration;
import org.eclipse.jetty.webapp.MetaInfConfiguration;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.webapp.WebXmlConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import com.github.diamond.client.netty.NetUtils;
/**
* 启动Jetty服务器。
*
* @author libinsong1204@gmail.com
*
*/
public class JettyServer {
private static final Logger LOGGER = LoggerFactory.getLogger(JettyServer.class);
private static int maxThreads;
private static int minThreads;
private static int serverPort;
private static String serverHost;
static {
try {
org.apache.commons.configuration.Configuration config =
new PropertiesConfiguration("META-INF/res/jetty.properties");
LOGGER.info("加载jetty.properties");
maxThreads = config.getInt("thread.pool.max.size", 100);
minThreads = config.getInt("thread.pool.min.size", 10);
serverPort = config.getInt("server.port", 8080);
serverHost = config.getString("server.host");
} catch(Exception e) {
LOGGER.error(e.getMessage(), e);
}
}
public static void main(String[] args) {
Thread.currentThread().setContextClassLoader(JettyServer.class.getClassLoader());
QueuedThreadPool pool = creatThreadPool();
Server server = new Server(pool);
WebAppContext context = new WebAppContext();
context.setResourceBase(SystemPropertyUtil.get("BASE_HOME") + File.separator + "webapp");
context.setContextPath("/");
context.setConfigurations(new Configuration[]{
new AnnotationConfiguration(),
new WebInfConfigurationExt(),
new WebXmlConfiguration(),
new MetaInfConfiguration(),
new FragmentConfiguration(),
new JettyWebXmlConfiguration()});
context.setThrowUnavailableOnStartupException(true);
context.setParentLoaderPriority(true);
context.setClassLoader(JettyServer.class.getClassLoader());
server.setHandler(context);
createServerConnector(server);
addShutdownHook(server);
try {
server.start();
server.join();
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
}
/**
* 创建线程池
* @return
*/
private static QueuedThreadPool creatThreadPool() {
QueuedThreadPool pool = new QueuedThreadPool();
pool.setMaxThreads(maxThreads);
pool.setMinThreads(minThreads);
pool.setIdleTimeout(60000);
pool.setDetailedDump(false);
return pool;
}
private static void createServerConnector(Server server) {
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSendServerVersion(false);
HttpConnectionFactory factory = new HttpConnectionFactory(httpConfig);
ServerConnector connector = new ServerConnector(server, factory);
connector.setPort(serverPort);
if(!StringUtils.hasText(serverHost))
serverHost = NetUtils.getLocalHost();
connector.setHost(serverHost);
LOGGER.info("jetty host={}, port={}", serverHost, serverPort);
connector.setReuseAddress(true);
connector.setAcceptQueueSize(1024);//backlog值
connector.setIdleTimeout(30000);
connector.setSoLingerTime(-1);
server.addConnector(connector);
}
/**
* 注册hook程序,保证线程能够完整执行。使用:kill -15 pid 关闭进程
*/
private static void addShutdownHook(final Server server) {
//为了保证TaskThread不在中途退出,添加ShutdownHook
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
LOGGER.info("收到关闭信号,hook起动,开始检测线程状态 ...");
try {
server.stop();
server.destroy();
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
System.out.println("================服务器停止成功================");
}
});
}
public static String getServerHost() {
return serverHost;
}
}