Jetty学习(一)

最近做一个项目,需要动态添加与移除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。

@Overridepublic void destroy() throws Exception {    if (server != null) {        server.stop();        server.destroy();    }}

@Overridepublic 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();}
时间: 2024-10-12 22:47:23

Jetty学习(一)的相关文章

Jetty学习三:配置概览-需要配置什么

上一节讲述了怎么配置Jetty,这节将告诉你使用Jetty你需要配置些什么. 配置Server Server实例是Jetty服务端的中心协调对象,它为所有其他Jetty服务端组件提供服务和生命周期管理.在标准Jetty发布中,核心的服务端配置是在etc/jetty.xml文件中,你也能在其中包含其他服务端配置,可以包括: 1)ThreadPool Server实例提供了一个线程池,你可以在etc/jetty.xml中配置最大线程数和最小线程数. 2)Handlers Jetty服务端只能有一个H

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

Jetty POJO配置 Jetty的核心组件是Plain Old Java Objects(POJOs):配置Jetty的大部分工作就是在Jetty POJOs上的初始化.装配和设置域的处理,你能通过以下的方式来实现:  1)直接通过Java代码初始化和装配Jetty对象.这个在后面Embedding Jetty讲. 2)用Jetty XML配置(一个控制反转(IoC)框架)初始化和装配Jetty对象.etc/jetty.xml文件是基本的Jetty XML配置文件,但有一些其它的etc/je

Jetty学习一:基本功能介绍

Jetty是一个开源项目,提供了HTTP Server,HTTP Client和Javax.servlet容器,这里(http://www.eclipse.org/jetty/)是它的官方网站,这里对它做一个基本的介绍,包括基本目录.启动方式和应用部署. Jetty目录结构 下面是Jetty 9.10的发布版本包含的文件和文件夹,及其作用. license-eplv10-aslv20.html Jetty的License文件 README.txt Jetty的基本信息和命令 VERSION.tx

Jetty学习六:配置连接器

连接器配置概览 连接器用于接收网络连接,配置一个连接器需要配置: 1)连接器的网络参数(例如:端口): 2)连接器使用的服务(例如:executors,schedulers): 3)为接收连接而初始化和配置协议的连接工厂. Jetty主要使用的连接器类型为ServerConnector. 标准Jetty发布使用下面的Jetty XML文件创建和配置连接器: 1)jetty-http.xml 初始化一个ServerConnector,用于接收HTTP连接(可以被升级到WebSocket连接). 2

Jetty学习四:部署到Jetty

Web应用的框架 标准Jetty发布版本能部署标准servlet Spec Web应用和Jetty内部ContextHandler部署描述符,或者两者的一个混合. Web应用是可部署的动态(servlets.filters.jsps.等等)和静态内容.支持库.和绑定到特定上下文路径的描写性的元数据的集合. 格式和布局最终都是通过Servlet Spec定义,你可以查阅官方Servlet Spec文档获取关于Web应用布局和结构的更多细节,这里将给出一个基本的轮廓. Web应用能被捆绑到一个单个的

jetty学习小结

1.什么是jetty? 开源HTTP服务器和Servlet引擎,是web应用的容器,同tomcat类似.由于其轻量灵活的特性,很多知名产品也应用了它,如maven.eclipse.hadoop.spark.activeMQ 2.为什么使用jetty? 异步的Servlet,支持更高的并发量(异步Servlet是Servlet3.0原生的东西,只是jett中的Continuation使它更高效) 模块化设计,更灵活易定制,也意味着更高的资源利用率(如久其现在使用的各个jar,模块化然后集中管理)

Jetty安装学习并展示

Jetty 的基本架构 Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler. 下图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和 Connector 两个组件构成,整个 Server 组件是基于 Handler 容器工作的

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

工作小几个月了,JDK基础和web应用框架学的的差不多了,开始学习Jetty源码,费了小半天才编译成功,把自己拆过的坑记录下来. 编译前的环境: MAVEN 3.3.Eclips eLuna Service Release 1 (4.4.1) 下载好MAVEN后,得把Eclipse中的maven配置为下载的MAVEN具体请搜索其他博文参考! 下载源码 导入eclipse 编译源码 1.下载源码 1.1 Jetty源码可以方便的在Github的Jetty工程主页上下载,链接. 1.2 进入主页后,

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

Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器. 它有一个基本数据模型,这个数据模型就是 Handler(处理器),所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler. 下图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和 Connector 两个组件构成,整个 Server 组件是基于 Handler 容