最近做一个项目,需要动态添加与移除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. 软件测试技术(六)——白盒测试之控制流覆盖准则+Visual Studio 2013单元测试

    一.目标程序 单片机发送的A/D转换结果的整体格式为:[DLE][STX]Message[CHKSUM][DLE][ETX],其中[]括号中的字符为16进制的助记符,并非ASCII码.其中:[DLE] ...

  2. 深入学习Android有关网络连接的内容

    基于实际项目中碰到的些许问题,开始重新深入学习Android网络连接有关知识. Android的4.1.2版本的AndroidHttpClient模块setSoTimeout之后实际超时时间和设置的时 ...

  3. uC/OS-II 移植笔记

    用过51.AVR.Freescale.STM32,但是写程序一直没有用过实时操作系统,一是因为写的项目不大,二是不太想去看手册学东西.现在写的项目也算比较大,因为需要,所以就学一下,这样也不至于每次的 ...

  4. 对Spring的理解

    1.Spring实现了工厂模式的工厂类,这个类名为BeanFactory实际上是一个接口,在程序中通常BeanFactory的子类ApplicationContext.Spring相当于一个大的工厂类 ...

  5. 初识HTML 5:关于它的三个三

    来源:http://www.ido321.com/949.html 一.HTML 5受欢迎的三个理由 1.IE.Google.Firefox.Safari.Opera等主流浏览器的支持 1.1  微软 ...

  6. Node.js中的事件

    var util = require("util"); //导入util模块 var events = require("events"); //导入event ...

  7. Could not bind factory to JNDI

    将hibernate.cfg.xml中 <session-factory name="SessionFactory">的name属性去掉即可

  8. Struts2的输入验证

    一.概述: ① Struts2的输入验证 –基于 XWorkValidation Framework的声明式验证:Struts2提供了一些基于 XWork Validation Framework的内 ...

  9. Winter is coming Just have a little faith. JSF框架简介与实例

    JSF 体系结构: JSF 的主要优势之一就是它既是Java Web应用程序的用户界面标准又是严格遵循模型-视图-控制器 (MVC) 设计模式的框架.用户界面代码(视图)与应用程序数据和逻辑(模型)的 ...

  10. [转载]Linux LVM硬盘管理及LVM扩容

    最近项目中一直在用Linux,其中涉及到了Linux的LVM,本来想自己写一篇关于LVM的文章,搜了一下,发现了一篇更好的,转载过来,也感谢作者gaojun 原文Linux LVM硬盘管理及LVM扩容 ...