我一直在寻找Flume的HttpSource internals,试着弄清楚如何使用Jetty服务器。
我见过使用过连接器的单个元素列表;此连接器将侦听已配置的Http主机和端口上的传入Http连接。然后为根路径创建Context,并将HttpServlet添加到此Context,其中包含接收连接时要执行的逻辑。最后,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是一个接一个地按顺序提供所有请求吗?
感谢您的帮助!
答案 0 :(得分:1)
首先注意:org.mortbay.jetty
表示您使用的是非常旧的版本的Jetty。可能是Jetty 5或Jetty 6.这些已经在2010年(及更早版本)回归EOL(End of Life'd)。
回到Jetty 6天,有一个按需使用的ThreadPool,根据你的Connector类型,它会导致每个连接的一个线程(称为阻塞连接器),或者每个nio选择一个线程(在这种情况下,您的1个连接在连接的生命周期内有许多线程,但每个连接永远不会超过1个。
从Jetty 8和Servlet异步开始,重构了这个线程模型,以支持请求处理的异步行为。
使用Jetty 9,所有阻塞连接器都被删除,支持完全异步处理请求,输入流和输出流。
当前模型用于按需使用线程的ThreadPool,仅在连接需要时(这可以用于处理请求,响应,或读取请求正文内容,或写入响应)身体内容,或活跃的websocket流媒体等...)
此模型适用于基于SPDY和HTTP / 2的支持,每个物理连接有多个请求。但要知道,在这些模型中,每个物理连接都有很多活动线程,具体取决于servlet的行为。
此外,Web应用程序本身可以选择为自己的处理启动更多线程,例如通过servlet异步处理行为,或者启动对其他服务的传出请求,或者处理与特定服务无关的其他任务请求/响应上下文。