已转移

Jetty嵌入式开发

嵌入Jetty服务,通常执行下面的步骤:

1)创建一个服务

2)添加和配置服务器线程池

3)添加和配置处理器

4)添加和配置Servlet、Webapp到处理器

5)添加和配置连接器

6)启动服务

7)等待(join服务防止主线程退出)

Jetty参数设置

线程池(ThreadPool)线程池线程资源大小确定了服务器的服务能力,默认大小不一定能满足生产环境,线程分配方式决定了服务器的资源利用效率,jetty自带的线程池QueuedThreadPool。

minThreads:最小线程数,默认10

maxThreads:最大线程数,默认200

detailedDump:表示是否记录详细的thread dump,默认false不记录。

连接器(Connector)

Connector主要分两类,BIO(同步阻塞IO)模式和NIO(异步阻塞IO)模式。

BIO模式的Connector有:

ScoketConnector (HTTP)

Ajp13SocketConnector (AJP)

SslSocketConnector (SSL)

NIO模式的Connector有:

SelectChannelConnector (HTTP)

SslSelectChannelConnector (SSL)

注意,如果配置多个Connector的话,建议各个Connector共享同一个线程池,即需要在Connector中指定线程池的名称,如:

各参数的含义:

host:jetty所在主机的IP或主机名;

port:设置jetty的端口号;

maxIdleTime:表示连接最大空闲时间,单位是ms,默认值300000这个值太大,典型值3000左右足够;

acceptors:接收线程数量,Acceptor的功能是接收客户端连接然后分配个给ThreadPool处理,表示同时在监听read事件的线程数,缺省值为2,对于NIO来说,建议值2*(处理器核数-1);或者小于等于2*处理器核数;

acceptQueueSize:在OS发起拒绝连接之前,请求连接排队的数量;

statsOn:是否开启统计功能,调优时建议关闭统计功能。默认关闭

confidentialPort:受信端口号;

lowResourcesConnections:  连接数量达到该数值时,Jetty会认为服务器资源已被耗尽。只有NIO才有这个设置,表示连接空闲时的最大连接数,大于这个数将被shutdown,每个acceptor的连接数=(lowResourcesConnections+acceptor-1)/ acceptor。

lowResourcesMaxIdleTime:表示可用线程稀少时或者当资源饱和时,连接最大等待时间,时间单位是毫秒,一般设置为<= maxIdleTime; 处理器(Handler)

Handler分为三类:

内容输出Handler

该类Handler根据target输出内容。如:ResourceHandler、ServletHandler、DefaultHandler等。这些类都是直接对Handler接口进行实现。

装饰模式Handler

该类Handler可以选择在交给另外一个Handler对象调用前或后来处理Request和Response。这些类都继承自HandlerWrapper类。

集合类Handler

该类Handler的作用是讲请求分发给其他Handler处理,分发策略由各自实现类决定。常用集合类Handler有HandlerCollection、HandlerList、ContextHandlerCollection。

示例代码:

Server server = newServer(DataCenterConfig.getHttpPort());

QueuedThreadPool threadPool= newQueuedThreadPool();

threadPool.setMaxThreads(250);

threadPool.setMinThreads(25);

server.setThreadPool(threadPool);

ServletContextHandler context= newServletContextHandler(ServletContextHandler.SESSIONS);

context.setContextPath("/");

server.setHandler(context);

context.addServlet(new ServletHolder(new CheckFileServlet()), "/check");

context.addServlet(new ServletHolder(new UploadFileServlet()), "/upload");

context.addServlet(new ServletHolder(new DownloadFileServlet()), "/download");

context.addFilter(AuthFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));

SelectChannelConnector connector= newSelectChannelConnector();

connector.setPort(DataCenterConfig.getHttpPort());

connector.setAcceptors(4);

connector.setAcceptQueueSize(2500);

connector.setThreadPool(new QueuedThreadPool(100));

connector.setName("JettyHttpServer");

connector.setLowResourcesConnections(10240);

server.setConnectors(newConnector[]{connector});

server.start();

参考:https://blog.csdn.net/xinfeixiang201411/article/details/80015675

Jetty 的工作原理以及与 Tomcat 的比较

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐