Jetty 同一端口启动多个Server项目方法之----Java代码方式

Jetty 同一端口启动多个Server项目方法之----Java代码方式

MultipleServicesAndOnePortStarter

在Jetty容器中,一般来说一个Server项目启动就对应一个端口,比如ProServer1、ProServer2都配置了8080端口,那么他们一般不能同时运行。
MultipleServicesAndOnePortStarter利用WebAppContext机制运用纯Java代码方式实现多服务公用一个端口。当然启动器也支持单项目启动。

代码:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.webapp.WebAppContext;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * Jetty 多服务公用一个端口启动器
 */
public class MultipleServicesAndOnePortStarter {
     


	public static void main(String[] args) throws Exception {
     
		Map<String,String> appMap=new HashMap<>();
		appMap.put("contextPath","warAbsolutePath");
		new MultipleServicesAndOnePortStarter().startApps(appMap,8080);
	}
	
	
	void startApps(Map<String,String> apps,int port) throws Exception {
     
		if(apps!=null&&apps.size()>0){
     
			Server server=new Server(port);
			int i=0;
			ContextHandlerCollection contexts = new ContextHandlerCollection();
			Iterator<Map.Entry<String, String>> iterator = apps.entrySet().iterator();
		    while (iterator.hasNext()){
     
				Map.Entry<String, String> appConfig = iterator.next();
				String warAbsolutePath=appConfig.getValue();
				String contextPath=appConfig.getKey();
				if(contextPath!=null&&warAbsolutePath!=null){
     
					System.out.println("-----------------------------");
					System.out.println("启动器扫描到一个Server:");
					System.out.println("ContextPath:"+contextPath);
					System.out.println("War:"+warAbsolutePath);
					WebAppContext app=new WebAppContext();
					app.setContextPath(contextPath);
					app.setParentLoaderPriority(true);
					app.setWar(warAbsolutePath);
					contexts.addHandler(app);
					i++;
					System.out.println("ContextPath:"+contextPath+",注册成功");
					System.out.println("-----------------------------");
				}
			}
			server.setHandler(contexts);
		    System.out.println("启动器扫描Server完成,发现Server个数:"+i+"\n\n正在启动Server,启动端口为:"+port+",请稍等…………");
			server.start();
		}
	}
}

使用方式:

只需要在main()方法中的appMap中以键值对的方式加入项目的上下文地址(ContextPath)和对应的war包的绝对地址,最后直接运行main()方法即可。同时可以指定端口号。

比如:

单项目

appMap.put("/user","f:\\server\\server1.war");

多项目

appMap.put("/user","f:\\server\\server1.war");
appMap.put("/pay","f:\\server\\server2.war");
appMap.put("/sso","f:\\server\\server3.war");

参数说明:

new MultipleServicesAndOnePortStarter().startApps(appMap,port);

appMap:服务应用集合,length()>=1
port:端口号

你可能感兴趣的:(Java后端,java,jetty)