main启动Jetty Server方式 web工程

               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);
		}
	}



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值