zoukankan      html  css  js  c++  java
  • jetty 9 嵌入式开发示例

    jetty 9 嵌入应用程序后,小型的web应用直接打成一个单独的jar包,就可以直接运行,非常适合做Demo演示或云端集群部署。

    主要代码:

    JettyServer的封装类

     1 package yjmyzz.jetty.demo.server;
     2 
     3 import org.eclipse.jetty.server.*;
     4 import org.eclipse.jetty.server.handler.HandlerCollection;
     5 import org.eclipse.jetty.server.handler.RequestLogHandler;
     6 import org.eclipse.jetty.server.handler.gzip.GzipHandler;
     7 import org.eclipse.jetty.util.thread.QueuedThreadPool;
     8 import org.eclipse.jetty.util.thread.ThreadPool;
     9 import org.eclipse.jetty.webapp.WebAppContext;
    10 import org.slf4j.LoggerFactory;
    11 
    12 import java.io.File;
    13 
    14 public class JettyWebServer {
    15 
    16     private static org.slf4j.Logger logger = LoggerFactory.getLogger(JettyWebServer.class);
    17 
    18     private Server server;
    19     private int port;
    20     private String host;
    21     private String tempDir;
    22     private String logDir;
    23     private String webDir;
    24     private String contextPath;
    25 
    26 
    27     public JettyWebServer(int port, String host, String tempDir, String webDir, String logDir, String contextPath) {
    28 
    29         logger.info("port:{},host:{},tempDir:{},webDir:{},logDir:{},contextPath:{}", port, host, tempDir, webDir, logDir, contextPath);
    30 
    31         this.port = port;
    32         this.host = host;
    33         this.tempDir = tempDir;
    34         this.webDir = webDir;
    35         this.contextPath = contextPath;
    36         this.logDir = logDir;
    37     }
    38 
    39     public void start() throws Exception {
    40         server = new Server(createThreadPool());
    41         server.addConnector(createConnector());
    42         server.setHandler(createHandlers());
    43         server.setStopAtShutdown(true);
    44         server.start();
    45     }
    46 
    47     public void join() throws InterruptedException {
    48         server.join();
    49     }
    50 
    51 
    52     private ThreadPool createThreadPool() {
    53         QueuedThreadPool threadPool = new QueuedThreadPool();
    54         threadPool.setMinThreads(10);
    55         threadPool.setMaxThreads(100);
    56         return threadPool;
    57     }
    58 
    59 
    60     private NetworkConnector createConnector() {
    61         ServerConnector connector = new ServerConnector(server);
    62         connector.setPort(port);
    63         connector.setHost(host);
    64         return connector;
    65     }
    66 
    67     private HandlerCollection createHandlers() {
    68         WebAppContext context = new WebAppContext();
    69         context.setContextPath(contextPath);
    70         context.setWar(webDir);
    71         context.setTempDirectory(new File(tempDir));
    72 
    73 
    74         RequestLogHandler logHandler = new RequestLogHandler();
    75         logHandler.setRequestLog(createRequestLog());
    76         GzipHandler gzipHandler = new GzipHandler();
    77         HandlerCollection handlerCollection = new HandlerCollection();
    78         handlerCollection.setHandlers(new Handler[]{context, logHandler, gzipHandler});
    79         return handlerCollection;
    80     }
    81 
    82     private RequestLog createRequestLog() {
    83         //记录访问日志的处理
    84         NCSARequestLog requestLog = new NCSARequestLog();
    85         requestLog.setFilename(logDir + "/yyyy-mm-dd.log");
    86         requestLog.setRetainDays(90);
    87         requestLog.setExtended(false);
    88         requestLog.setAppend(true);
    89         //requestLog.setLogTimeZone("GMT");
    90         requestLog.setLogTimeZone("Asia/Shanghai");
    91         requestLog.setLogDateFormat("yyyy-MM-dd HH:mm:ss SSS");
    92         requestLog.setLogLatency(true);
    93         return requestLog;
    94     }
    95 
    96 }
    View Code

    启动代码示例:

      1 package yjmyzz.jetty.demo.main;
      2 
      3 import org.slf4j.Logger;
      4 import org.slf4j.LoggerFactory;
      5 import org.springframework.util.StringUtils;
      6 import yjmyzz.jetty.demo.server.JettyWebServer;
      7 import yjmyzz.jetty.demo.util.FileUtil;
      8 import yjmyzz.jetty.demo.util.JarUtils;
      9 
     10 import java.util.HashMap;
     11 import java.util.Map;
     12 
     13 public class JettyApp {
     14 
     15     private static final String PORT = "port";
     16     private static final String WEB_DIR = "web";
     17     private static final String LOG_DIR = "log";
     18     private static final String TEMP_DIR = "temp";
     19     private static final String CONTEXT_PATH = "context";
     20     private static final String HOST = "host";
     21     private static final Map<String, String> param = new HashMap<>();
     22     private static Logger logger = LoggerFactory.getLogger(JettyWebServer.class);
     23 
     24 
     25     public static void main(String... anArgs) throws Exception {
     26 
     27         if (anArgs.length == 0) {
     28             param.put(PORT, "8080");
     29             param.put(WEB_DIR, "web");
     30             param.put(LOG_DIR, "logs");
     31             param.put(TEMP_DIR, "temp");
     32             param.put(CONTEXT_PATH, "/demo");
     33             param.put(HOST, "localhost");
     34         }
     35 
     36 
     37         for (String arg : anArgs) {
     38             System.out.println(arg);
     39             if (!StringUtils.isEmpty(arg) && arg.contains("=")) {
     40                 String[] t = arg.trim().split("=");
     41                 param.put(t[0], t[1]);
     42             }
     43         }
     44 
     45         initParam();
     46 
     47         unzipSelf();
     48 
     49         new JettyApp().start();
     50     }
     51 
     52 
     53     private static void initParam() {
     54 
     55 
     56         String logDir = FileUtil.currentWorkDir + param.get(LOG_DIR);
     57         String tempDir = FileUtil.currentWorkDir + param.get(TEMP_DIR);
     58         String webDir = FileUtil.currentWorkDir + param.get(WEB_DIR);
     59 
     60         logger.debug(logDir);
     61         logger.debug(tempDir);
     62         logger.debug(webDir);
     63 
     64         String temp = "x.x";//占位
     65         FileUtil.createDirs(logDir + "/" + temp);
     66         FileUtil.createDirs(tempDir + "/" + temp);
     67         FileUtil.createDirs(webDir + "/" + temp);
     68 
     69         param.put(LOG_DIR, logDir);
     70         param.put(TEMP_DIR, tempDir);
     71         param.put(WEB_DIR, webDir);
     72     }
     73 
     74     private JettyWebServer server;
     75 
     76     public JettyApp() {
     77         server = new JettyWebServer(
     78                 Integer.parseInt(param.get(PORT).toString()),
     79                 param.get(HOST),
     80                 param.get(TEMP_DIR),
     81                 param.get(WEB_DIR),
     82                 param.get(LOG_DIR),
     83                 param.get(CONTEXT_PATH));
     84     }
     85 
     86     public void start() throws Exception {
     87         server.start();
     88         server.join();
     89     }
     90 
     91     private static void unzipSelf() {
     92         //将jar自身解压
     93 
     94         String selfPath = FileUtil.getJarExecPath(JettyApp.class);
     95         if (selfPath.endsWith(".jar")) {
     96             // 运行环境
     97             try {
     98                 logger.info("正在将
    " + selfPath + "
    解压至
    " + param.get(WEB_DIR));
     99                 JarUtils.unJar(selfPath, param.get(WEB_DIR));
    100             } catch (Exception e) {
    101                 logger.error("解压web内容失败!", e);
    102             }
    103         } else {
    104             // IDE环境
    105             param.put(WEB_DIR, selfPath);
    106         }
    107         logger.info(selfPath);
    108     }
    109 }
    View Code

    我在github上开源了一个jetty9 + spring mvc4 + velocity2的示例项目,地址:https://github.com/yjmyzz/jetty-embed-demo

  • 相关阅读:
    老王python博客
    python中文分词
    python 字典(dict)get方法应用
    python yield和generators(生成器)
    python ASCII返回对应的值(chr)
    python 字符串特点
    python 包的定义,结构,导入过程
    fabric的安装和配置
    python 正则表达式re findall
    python unittest单元测试方法和用例
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/jetty-embed-demo.html
Copyright © 2011-2022 走看看