main启动Jetty Server方式
web工程通过main启动jetty server方式
1.JettyServerLauncher
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
public class JettyServerLauncher {
private static final int DEFAULT_PORT = 8080;
private static final String DEFAULT_WEBAPP = "WebRoot";
private static final String DEFAULT_WEB = "WebRoot/WEB-INF/web.xml";
private static final String DEFAULT_PROJECT = "ABMP";
private static Server server;
public static void main(String[] args) throws Exception {
JettyServerLauncher.startJetty(getPortFromArgs(args));
}
private static int getPortFromArgs(String[] args) {
if (args.length > 0) {
try {
return Integer.valueOf(args[0]);
} catch (NumberFormatException ignore) {
System.out.println(ignore);
}
}
return DEFAULT_PORT;
}
private static void startJetty(int port) throws Exception {
server = new Server(port);
server.setHandler(getWebAppContext());
server.start();
server.join();
}
public static void stopJetty() throws Exception{
server.stop();
}
private static WebAppContext getWebAppContext(){
WebAppContext context = new WebAppContext();
context.setDescriptor(DEFAULT_WEB);
context.setResourceBase(DEFAULT_WEBAPP);
context.setContextPath(DEFAULT_PROJECT);
context.setParentLoaderPriority(true);
return context;
}
}
2.Jetty 启动 server.join的含义
如果server没有起来,这里面join()函数骑到的作用就是使线程阻塞, 这里join()函数实质上调用的jetty的线程池。(这里和Thread中的join函数相似)
如果没有join函数,jetty服务器也能正常启动或运行正常,是因为jetty比较小,启动速度非常快。
然而如果你的application比较重的话, 调用join函数,能够保证你的server真正的起来。
3.补充一个问题:调用server.stop只是将服务关闭了,但进程并没有关闭!这里再加一个关闭进程方法
在原有的stopJetty方法改造一下!
public static void stopJetty() throws Exception{
server.stop();
String name = ManagementFactory.getRuntimeMXBean().getName();
String pid = name.split("@")[0];
String os = System.getProperty("os.name");
if (os != null && os.startsWith("Windows")){
Runtime.getRuntime().exec("Taskkill /f /IM " + pid);
}else{
String[] cmd ={"sh","-c","kill -9 "+pid};
Runtime.getRuntime().exec(cmd);
}
}
二.spring集成jersey方式
public static void launchSpringJerseyServer(int port, String contextPath, Map<String, String> paramMap) {
ServletHolder servletHolder = new ServletHolder(SpringServlet.class);
/**
* 加载spring 配置文件
*/
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring-all.xml");
SpringUtils.setApplicationContext(ctx);// 保存Spring上下文对象到静态变量
servletHolder.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
"com.sun.jersey.api.core.PackagesResourceConfig");
/**
* 设置处理器(servlet )所在的包,如果不设置,会找不到那个处理的servlet
*/
servletHolder.setInitParameter("com.sun.jersey.config.property.packages",
"org.vimtang.ws.rs.server.jersey.service");
/**
* 使 jersey 设置的返回类型 (json)有效
*/
servletHolder.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true");
servletHolder.setInitParameter("com.sun.jersey.spi.container.ContainerResponseFilters",
"org.vimtang.ws.rs.server.jersey.filter.CORSFilter");
/**
* 为jersey的ServletContextHandler 设置 ApplicationContext
*/
ServletContextHandler contextHandler = new ServletContextHandler();
contextHandler.setInitParameter("spring.profiles.active",
"dev");
contextHandler.setInitParameter("spring.profiles.default",
"dev");
contextHandler.setInitParameter("spring.liveBeansView.mbeanDomain",
"dev");
contextHandler.setContextPath(contextPath);
contextHandler.setClassLoader(ctx.getClassLoader());
XmlWebApplicationContext xmlWebAppContext = new XmlWebApplicationContext();
xmlWebAppContext.setParent(ctx);
xmlWebAppContext.setConfigLocation("");
xmlWebAppContext.setServletContext(contextHandler.getServletContext());
xmlWebAppContext.refresh();
contextHandler.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, xmlWebAppContext);
/**
* 设置 servlet对应的访问路径
*/
String webServiceCtxRegex = paramMap.get(_CALLER_WS_CONTEXT);
if (null == webServiceCtxRegex) {
webServiceCtxRegex = "/ws/*";
}
contextHandler.addServlet(servletHolder, webServiceCtxRegex);
HandlerList handlers = new HandlerList();
handlers.addHandler(contextHandler);
Server server = new Server();
SelectChannelConnector connector0 = new SelectChannelConnector();
connector0.setPort(port);
connector0.setMaxIdleTime(30000);
connector0.setRequestHeaderSize(1024000);
connector0.setThreadPool(new QueuedThreadPool(1024));
server.setConnectors(new Connector[]{connector0});
server.setHandler(handlers);
try {
server.start();
server.join();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
try {
Map<String, String> props = fetchProperties();
int port = 82;
String contextPath = "/iqm";
launchSpringJerseyServer(port, contextPath, props);
} catch(Exception ex) {
logger.error("server launching failed", ex);
}
}