Jetty嵌入式開發及參數設置


已轉移

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/

Jetty 的工作原理以及與 Tomcat 的比較


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM