/**
* Copyright 2013-2014 the original author or authors.
*
* Licensed 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 com.iflytek.edu.cloud.frame.jetty;
import java.io.File;
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.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.iflytek.edu.cloud.frame.jetty.support.WebInfConfigurationExt;
import com.iflytek.edu.cloud.frame.utils.SystemPropertyUtil;
/**
* 启动Jetty服务器。
*
* @author libinsong1204@gmail.com
*
*/
public class JettyServer {
private static final Logger LOGGER = LoggerFactory.getLogger(JettyServer.class);
public static void main(String[] args) {
Thread.currentThread().setContextClassLoader(JettyServer.class.getClassLoader());
loadPorperties();
QueuedThreadPool pool = creatThreadPool();
Server server = new Server(pool);
WebAppContext context = new WebAppContext();
context.setResourceBase(SystemPropertyUtil.get("BASE_HOME") + File.separator + "web");
context.setContextPath("/");
context.setConfigurations(new Configuration[]{ new WebInfConfigurationExt(), new AnnotationConfiguration()});
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(JettyConfigUtil.getMaxThreads());
pool.setMinThreads(JettyConfigUtil.getMinThreads());
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(JettyConfigUtil.getServerPort());
connector.setAcceptQueueSize(1024);
connector.setIdleTimeout(30000); //backlog值
connector.setSoLingerTime(-1);
server.addConnector(connector);
}
private static void loadPorperties() {
}
/**
* 注册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("================服务器停止成功================");
}
});
}
}