已轉移
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 = new Server(DataCenterConfig.getHttpPort()); QueuedThreadPool threadPool = new QueuedThreadPool(); threadPool.setMaxThreads(250); threadPool.setMinThreads(25); server.setThreadPool(threadPool); ServletContextHandler context = new ServletContextHandler(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 = new SelectChannelConnector(); connector.setPort(DataCenterConfig.getHttpPort()); connector.setAcceptors(4); connector.setAcceptQueueSize(2500); connector.setThreadPool(new QueuedThreadPool(100)); connector.setName("JettyHttpServer"); connector.setLowResourcesConnections(10240); server.setConnectors(new Connector[]{connector}); server.start();
參考:https://blog.csdn.net/xinfeixiang201411/article/details/80015675
Jetty 的工作原理以及與 Tomcat 的比較 https://www.ibm.com/developerworks/cn/java/j-lo-jetty/