我一直在研究flume的httpsource内部,试图弄清楚jetty服务器是如何使用的。
我见过一个连接器的单一元素列表被使用;此连接器将在配置的http主机和端口上侦听传入的http连接。然后为根路径创建一个上下文,并向该上下文添加一个httpservlet,其中包含接收到连接时要执行的逻辑。最后,启动jetty服务器。
Connector[] connectors = new Connector[1];
if (sslEnabled) {
SslSocketConnector sslSocketConnector = new HTTPSourceSocketConnector(excludedProtocols);
...
connectors[0] = sslSocketConnector;
} else {
SelectChannelConnector connector = new SelectChannelConnector();
...
connectors[0] = connector;
}
connectors[0].setHost(host);
connectors[0].setPort(port);
srv.setConnectors(connectors);
try {
org.mortbay.jetty.servlet.Context root = new org.mortbay.jetty.servlet.Context(srv, "/", org.mortbay.jetty.servlet.Context.SESSIONS);
root.addServlet(new ServletHolder(new FlumeHTTPServlet()), "/");
HTTPServerConstraintUtil.enforceConstraints(root);
srv.start();
...
我的问题是,看看上面的实现:这样的jetty服务器是否为每个传入的http连接创建一个线程?或者是一个唯一的httpservlet依次为所有请求提供服务?
谢谢你的帮助!
1条答案
按热度按时间gr8qqesn1#
首先注意:
org.mortbay.jetty
意味着你正在使用一个非常旧版本的jetty。可能是5号码头或6号码头。早在2010年(以及更早的时候),它们就已经过时了。早在jetty 6天的时候,就有一个按需使用的线程池,根据连接器类型,它会导致每个连接有一个线程(称为阻塞连接器),或者每个nio有一个线程选择(在这种情况下,1连接在连接的生命周期中有许多线程,但每个连接的活动时间不得超过1次)。
从Jetty8和ServletAsync开始,对这个线程模型进行了重构,以更倾向于请求处理的异步行为。
在jetty9中,为了支持请求、请求的inputstreams和请求的outputstreams的完全异步处理,删除了所有阻塞连接器。
当前模型是一个线程池,仅当连接需要时才按需使用(这可能是用于处理请求或响应,或读取请求正文内容,或写入响应正文内容,或活动websocket流等等)
这种模式更适合于基于spdy和http/2的支持,在这种支持中,每个物理连接有多个请求。但是要知道,在这些模型中,根据servlet的行为,每个物理连接有多个活动线程是很有可能的。
此外,web应用程序本身可以选择为自己的处理(例如通过servlet异步处理行为)启动更多线程,或者启动对其他服务的传出请求,或者处理与特定请求/响应上下文无关的其他任务。