jetty 9 嵌入式开发示例_jetty



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

主要代码:

JettyServer的封装类


jetty 9 嵌入式开发示例_eclipse_02jetty 9 嵌入式开发示例_jar_03


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

启动代码示例:


jetty 9 嵌入式开发示例_eclipse_02jetty 9 嵌入式开发示例_jar_03


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("正在将\n" + selfPath + "\n解压至\n" + 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​


作者:菩提树下的杨过