package cn.dreampie.server.provider.jetty; import cn.dreampie.common.Constant; import cn.dreampie.common.util.Lister; import cn.dreampie.log.Logger; import cn.dreampie.server.ReloadObserver; import cn.dreampie.server.ReloadRunnable; import cn.dreampie.server.RestyServer; import cn.dreampie.server.ServerException; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.SessionManager; import org.eclipse.jetty.util.resource.ResourceCollection; import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.xml.XmlConfiguration; import java.io.File; import java.io.InputStream; import java.net.URL; import java.util.Enumeration; import java.util.List; /** * Created by Dreampie on 16/9/6. */ public class JettyServerProvider extends RestyServer { private static final Logger logger = Logger.getLogger(JettyServerProvider.class); private Server server; private WebAppContext webAppContext; protected void init() throws Exception { InputStream jettyInputStream = classLoader.getResourceAsStream("jetty-server.xml"); if (jettyInputStream != null) { server = (Server) new XmlConfiguration(jettyInputStream).configure(); } else { server = new Server(port); } server = new Server(port); webAppContext = new WebAppContext(); webAppContext.setParentLoaderPriority(true); webAppContext.setThrowUnavailableOnStartupException(true); classPath = classLoader.getResource(".").getPath(); rootPath = new File(classPath).getParentFile().getParentFile().getCanonicalFile().getAbsolutePath() + "/"; File webappDir = new File(rootPath + resourceBase); if (!webappDir.exists() || !webappDir.isDirectory()) { throw new IllegalArgumentException("Could not found webapp directory or it is not directory."); } String webappUrl = webappDir.getAbsolutePath(); webXmlPath = webappUrl + "/WEB-INF/web.xml"; webAppContext.setDescriptor(webXmlPath); webAppContext.setContextPath(contextPath); webAppContext.setResourceBase(webappUrl); Enumeration<URL> staticUrls = classLoader.getResources("META-INF/resources"); URL staticURL; List<String> resourceUrls = Lister.of(); resourceUrls.add(webappUrl); while (staticUrls.hasMoreElements()) { staticURL = staticUrls.nextElement(); if (staticURL != null) { resourceUrls.add(staticURL.toExternalForm()); } } if (resourceUrls.size() > 0) { webAppContext.setBaseResource(new ResourceCollection(resourceUrls.toArray(new String[resourceUrls.size()]))); } webAppContext.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false"); webAppContext.setInitParameter("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false"); SessionManager sessionManager = webAppContext.getSessionHandler().getSessionManager(); sessionManager.setSessionIdPathParameterName(null); server.setHandler(webAppContext); } public void start() throws Exception { if (!isBuild) { throw new ServerException("You must build it before start"); } if (Constant.devEnable) { reloadRunnable = new ReloadRunnable(this); reloadObserver = new ReloadObserver(reloadRunnable, this); reloadRunnable.addObserver(reloadObserver); watchThread = new Thread(reloadRunnable, "RestyServer-Watcher");//启动文件监控线程 watchThread.start(); } server.start(); server.join(); } public void stop() throws Exception { if (Constant.devEnable) { if (!watchThread.isInterrupted()) { watchThread.interrupt(); } } webAppContext.stop(); server.stop(); } public void destroy() throws Exception { webAppContext.destroy(); server.destroy(); } public void restartWebApp() throws Exception { webAppContext.stop(); logger.info("JettyServer restart..."); webAppContext.start(); } }