最近做一个项目,需要动态添加与移除servlet容器的http端口,并且启动都是嵌入式的。因此,果断选择了Jetty。
       在模块化方面,Jetty是做的相当给力的一个容器,对于端口的动态增删能力,动态启停等都来源于这种强大的模块化设计。
  • 动态增删端口
       一般在嵌入式Jetty中,都会通过一个handlerCollection来负责接收所有的接入请求。为了做到动态添加与移除的效果,做了如下权衡。
1.启动之初
启动之初,只将server启动,并且加入一个空的handlerCollection。此时,有一点要注意,
/* ------------------------------------------------------------ */
public HandlerCollection()
{
_mutableWhenRunning=false;
} /* ------------------------------------------------------------ */
public HandlerCollection(boolean mutableWhenRunning)
{
_mutableWhenRunning=mutableWhenRunning;
}
无参构造函数默认的不允许在运行期间加入新的实例。因此,必须初始化填true。
private HandlerCollection handlers = new HandlerCollection(true);
2.动态加端口
List<Handler> handlerList = new LinkedList<>();
if (handlers.getHandlers() != null) {
for(Handler temp : handlers.getHandlers()) {
handlerList.add(temp);
}
} MockHandler handler = new MockHandler(port, sysCode, mockDao);
handler.setServer(server);
handler.start();
handlerList.add(handler);
handlers.setHandlers(handlerList.toArray(new MockHandler[0])); Connector connector = getConnector(port);
server.addConnector(connector);
connector.start();
private ServerConnector getConnector(int port) {
ServerConnector connector = new ServerConnector(server);
connector.setPort(port); return connector;
}
 
每添加一个handler,必须先启动,让其先准备好,然后再替换之前的handler集合。
3.动态移除端口
for (Connector connector : server.getConnectors()) {
ServerConnector serverConnector = (ServerConnector) connector;
if (codePort == serverConnector.getPort()) {
connector.stop();
server.removeConnector(connector); List<Handler> mockHandlers = new LinkedList<>();
for(Handler tempHandler : handlers.getHandlers()) {
MockHandler mockTempHandler = (MockHandler) tempHandler;
if (!mockTempHandler.getSysCode().equals(sysCode)) {
mockHandlers.add(tempHandler);
} else {
mockTempHandler.stop();
}
}
handlers.setHandlers(mockHandlers.toArray(new MockHandler[0]));
break;
} else {
continue;
}
}
 
移除之前,先要停止此handler工作,避免继续接入新的请求,但是处理者已经消失导致未知异常。
  • 动态启停
        关于动态启停,这归属于Jetty的嵌入式使用方式,有一点要注意的就是,启动Jetty将会hold住当前线程,因此可能需要一个独立线程来启动server。
@Override
public void destroy() throws Exception {
if (server != null) {
server.stop();
server.destroy();
}
} @Override
public void afterPropertiesSet() throws Exception {
new Thread() {
@Override
public void run() {
server = new Server();
server.setHandler(handlers);
try {
server.start();
server.join();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
 

Jetty学习(一)的更多相关文章

  1. Jetty学习四:部署到Jetty

    转自:http://www.tuicool.com/articles/NrENjq Web应用的框架 标准Jetty发布版本能部署标准servlet Spec Web应用和Jetty内部Context ...

  2. Jetty学习二:配置概览-怎么配置Jetty

    Jetty POJO配置 Jetty的核心组件是Plain Old Java Objects(POJOs):配置Jetty的大部分工作就是在Jetty POJOs上的初始化.装配和设置域的处理,你能通 ...

  3. jetty学习小结

    1.什么是jetty? 开源HTTP服务器和Servlet引擎,是web应用的容器,同tomcat类似.由于其轻量灵活的特性,很多知名产品也应用了它,如maven.eclipse.hadoop.spa ...

  4. spring学习总结(mybatis,事务,测试JUnit4,日志log4j&slf4j,定时任务quartz&spring-task,jetty,Restful-jersey等)

    在实战中学习,模仿博客园的部分功能.包括用户的注册,登陆:发表新随笔,阅读随笔:发表评论,以及定时任务等.Entity层设计3张表,分别为user表(用户),essay表(随笔)以及comment表( ...

  5. Tomcat学习总结(7)——Tomcat与Jetty比较

    Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器. 它有一个基本数据模型,这个数据模型就是 Handler(处理 ...

  6. Jetty源码学习-编译Jetty源码二三事

    工作小几个月了,JDK基础和web应用框架学的的差不多了,开始学习Jetty源码,费了小半天才编译成功,把自己拆过的坑记录下来. 编译前的环境: MAVEN 3.3.Eclips eLuna Serv ...

  7. Java高并发程序设计学习笔记(十一):Jetty分析

    转自:https://blog.csdn.net/dataiyangu/article/details/87894253 new Server()初始化线程池QueuedThreadPoolexecu ...

  8. Jetty安装学习并展示

    Jetty 的基本架构 Jetty 眼下的是一个比較被看好的 Servlet 引擎,它的架构比較简单,也是一个可扩展性和很灵活的应用server,它有一个基本数据模型,这个数据模型就是 Handler ...

  9. sh - 脚本学习 启动/停止/重启/部署jetty crontab

    ===============jettytest.sh ====================== #!/bin/shjettysh_path=/usr/local/jetty/bin/jetty. ...

随机推荐

  1. 【开发流程】土耳其CDD工具

    土耳其的CDD工具开发到现在已经三个星期了,进展非常不顺利,从最开始的遇到很多难题没法解决到现在工具可以运行但是有一个bug. 起初遇到的ExternalUtranCell这一页的信息很难填,没有解决 ...

  2. 多校6 1003 HDU5795 A Simple Nim (sg函数)

    思路:直接打表找sg函数的值,找规律,没有什么技巧 还想了很久的,把数当二进制看,再类讨二进制中1的个数是必胜或者必败状态.... 打表: // #pragma comment(linker, &qu ...

  3. 一个使用微软Azure blob实现文件下载功能的实例-附带源文件

    Running the sample Please follow the steps below. Step 1: Open the CSAzureServeFilesFromBlobStorage. ...

  4. 多级联动导航栏(top导航)

    http://www.dynamicdrive.com/style/csslibrary/item/jquery_multi_level_css_menu_2/ This is a multi-lev ...

  5. 在Raspberry Pi上安装XBMC

    2013-05-22 XBMC is a free and open source media player application developed by the XBMC Foundation, ...

  6. Oauth2 接口api

    weibo:http://open.weibo.com/wiki/API weixin:http://mp.weixin.qq.com/wiki/home/index.html   qq开发平台: 1 ...

  7. AspNetPager 的使用

    下面选用的是新闻发布系统里用的代码. SQL 存储过程: CREATE PROCEDURE procNewsSelectByPager @startRecordIndex int, @endRecor ...

  8. Row Border in DataGrid 表格边框

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 第二百八十六天 how can I 坚持

    bug不断啊,头疼. 今天早上到的倒是挺早. 中午吃的黄焖鸡,晚上加了会班. 勇江的鱼都死了,杨建的还剩3条,晚上到家都快十点了,还洗了衣服,没捞出来呢, 希望可以请下来假吧. 晾上衣服睡觉.

  10. ocp 1Z0-051 1-22题解析

    1. View the Exhibit andexamine the structure of the SALES, CUSTOMERS, PRODUCTS, and TIMES tables. Th ...