美文网首页
嵌入式Jetty服务器

嵌入式Jetty服务器

作者: 年少懵懂丶流年梦 | 来源:发表于2018-06-08 08:36 被阅读77次

    话不多说,直接上代码,相信很好懂。Gradle构建项目。

    compile 'org.eclipse.jetty.aggregate:jetty-all:9.4.9.v20180320'

    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.util.component.AbstractLifeCycle;
    import org.eclipse.jetty.util.component.LifeCycle;
    import org.eclipse.jetty.webapp.WebAppContext;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.nio.file.Path;
    
    public class BaseServer {
        protected Path contextPath;
        public WebAppContext webAppContext=null;
        public Server server=null;
        protected int port;
        protected String serverName="server";
    
        public BaseServer(){
        }
        public BaseServer(int port,Path contextPath){
            this.contextPath = contextPath;
            this.port=port;
    
        }
        RunStatus runStatus=RunStatus.stoped;
        protected Logger logger= LoggerFactory.getLogger(this.getClass());
        private String throwable;
    
        public void start() throws Exception {
            start(null);
        }
    
        void callHandler(RuningStatusHandler handler, RunStatus status){
            runStatus=status;
            if(handler!=null){
                handler.onSatusChanged(status);
            }
        }
    
        public String getThrowable() {
            return throwable;
        }
    
        public void setThrowable(String throwable) {
            this.throwable = throwable;
        }
        public void start(RuningStatusHandler handler) throws Exception {
            this.stop();
            if(runStatus!=RunStatus.stoped){
                return;
            }
            callHandler(handler,RunStatus.starting);
            server=new Server(port);
            String webContext=this.contextPath.toString();
            webAppContext = new WebAppContext(webContext,"/");
            webAppContext.setResourceBase(webContext);
            webAppContext.setDisplayName(this.serverName);
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            webAppContext.setClassLoader(classLoader);
            webAppContext.setConfigurationDiscovered(true);
            webAppContext.setParentLoaderPriority(true);
            server.setHandler(webAppContext);
    
            server.addLifeCycleListener(new AbstractLifeCycle.AbstractLifeCycleListener() {
                @Override
                public void lifeCycleFailure(LifeCycle event, Throwable cause) {
                    super.lifeCycleFailure(event, cause);
                    setThrowable(cause.getMessage());
                    logger.error("服务启动失败",cause);
                    callHandler(handler,RunStatus.startingfail);
                    server=null;
                    webAppContext=null;
                }
    
                @Override
                public void lifeCycleStarted(LifeCycle event) {
                    super.lifeCycleStarted(event);
                    logger.info("服务已启动");
                    callHandler(handler,RunStatus.started);
                }
    
                @Override
                public void lifeCycleStarting(LifeCycle event) {
                    super.lifeCycleStarting(event);
                    logger.info("服务启动中");
                    callHandler(handler,RunStatus.starting);
                }
    
                @Override
                public void lifeCycleStopped(LifeCycle event) {
                    super.lifeCycleStopped(event);
                    logger.info("服务已停止");
                    server=null;
                    webAppContext=null;
                    callHandler(handler,RunStatus.stoped);
                }
                @Override
                public void lifeCycleStopping(LifeCycle event) {
                    super.lifeCycleStopping(event);
                    callHandler(handler,RunStatus.stoping);
                    logger.info("服务正在停止");
                }
            });
            // 检测环境
    
            server.start();
            server.dumpStdErr();
            server.join();
        }
    
        public void stop(){
            if(runStatus!=RunStatus.started){
                return;
            }
            if(this.server!=null){
                try{
                    this.server.stop();
                }catch (Exception ex){
                    logger.error("停止服务异常",ex);
                }
            }
        }
    
        public enum RunStatus{
            starting,
            startingfail,
            started,
            stoped,
            stoping
        }
    
        public interface  RuningStatusHandler{
            void onSatusChanged(RunStatus status);
        }
    }
    
    
    import com.jdsoft.studio.server.BaseServer
    
    import java.nio.file.Path
    import java.nio.file.Paths
    
    /**
     *  启动Server
     */
    class AppRepoServer extends BaseServer {
        static {
            System.setProperty("logback.configurationFile", "logback.xml")
        }
    
        AppRepoServer(){
    
        }
        @Override
        void start(BaseServer.RuningStatusHandler handler) throws Exception {
            File startPath = null
            try {
                startPath = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath())
                if(startPath.isFile()){
                    startPath=startPath.getParentFile()
                }
                logger.info("起始位置:{}",startPath)
                boolean isDevEnv=false
                Path classFile = Paths.get(startPath.getPath(), "com", "jdsoft", "studio", "server", "appreop", "AppRepoServer.class")
                if(classFile.toFile().exists()){
                    //开发环境
                    isDevEnv=true
                }
                logger.info("是否是开发环境:{}",isDevEnv)
                String webContext=null
                String userdir = System.getProperty("user.dir")
                logger.info("user.dir:{}",userdir)
                if(isDevEnv){
                    webContext=userdir+ "/modules/appRepoServer/src/main/webapp"
                }else{
                    // todo
    //                webContext=startPath+ "webapp"
                    webContext="webapp"
                }
                logger.info("webContext:{}",webContext)
                this.contextPath=Paths.get(webContext)
                this.serverName="AppRepoServer"
                super.start(handler)
    
            } catch (URISyntaxException e) {
                logger.error("启动异常",e)
                throw  e
            }
        }
    
        AppRepoServer(int port){
            this()
            this.port=port
        }
    }
    
    

    相关文章

      网友评论

          本文标题:嵌入式Jetty服务器

          本文链接:https://www.haomeiwen.com/subject/laddlftx.html