jetty 9 嵌入式开发示例
时间:2022-04-22
本文章向大家介绍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 }
启动代码示例:
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 }
我在github上开源了一个jetty9 + spring mvc4 + velocity2的示例项目,地址:https://github.com/yjmyzz/jetty-embed-demo
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 记一次关于MySQL与PHP的蠢事
- 编写一个简单的JQuery插件
- Spring AOP异常:Error creating bean with name ‘org.springframework.aop.aspectj.
- Tomcat7 Redis Session 共享
- CodeIgniter (CI) 框架学习 -- load_class
- Laravel框架学习 -- php artisan down/up
- Spring中基于注解@AspectJ的AOP实现
- python提高--running-python-code-contained-in-a-strin
- linux shell 监控脚本 及 邮件发送
- Laravel框架学习 -- 安装
- Redis 键管理与小功能
- redis 数据持久化
- 不蒜子 | 给网站、博客文章添加阅读次数统计,我用两行代码 搞定计数
- redis 主从复制
- Spring 当一个接口多个实现时,怎么注入