亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Tomcat服務(wù)器配置參考

系統(tǒng) 1958 0

Tomcat服務(wù)器配置參考 ?

?
?

Coyote HTTP/1.1 Connector

?

概述

Coyote HTTP/1.1 Connector元素是一個支持HTTP/1.1協(xié)議的Connector組件。它使Catalina除了能夠執(zhí)行servlet和JSP頁面外,還能夠作為一個單獨(dú)的web server運(yùn)行。Connector對象的實(shí)例在服務(wù)器上監(jiān)聽特定的TCP端口。一個Service可以配置一個或多個這樣的Connector,每個Connector都把請求轉(zhuǎn)發(fā)給對應(yīng)Engine進(jìn)行處理,并產(chǎn)生響應(yīng)。

在 服務(wù)器啟動的時候,Connector會創(chuàng)建一些請求處理線程(基于minProcessors屬性值)。每個請求需要一個線程為其服務(wù),直到服務(wù)完成。 如果同一時刻的請求數(shù)多于可用的請求處理線程,會創(chuàng)建額外的處理線程,線程數(shù)的上限是maxProcessors。如果已經(jīng)到達(dá)了最大請求數(shù),仍然有請求 發(fā)生,它們被緩存在由Connector創(chuàng)建的server socket中,直到緩存的上限(由acceptCount屬性的值定義)。這以后所有的請求都會收到“拒絕連接”的錯誤,直到有資源能夠處理它們。

屬性
公共屬性

所有Connector的實(shí)現(xiàn)支持如下屬性:

屬性 描述
enableLookups

如果希望調(diào)用request.getRemoteHost()進(jìn)行DNS查詢,以返回遠(yuǎn)程客戶的實(shí)際主機(jī)名,將enableLookups設(shè)為true。如果希望忽略DNS查詢,僅僅返回IP地址,設(shè)為false(這樣提高了性能)。缺省情況下,DNS查詢是使能的。

redirectPort 如果Connector支持非SSL請求,在收到一個要求使用SSL傳輸?shù)恼埱笠院螅珻atalina會自動將該請求重定向到這里指定的端口號。
scheme

調(diào)用request.getScheme()時返回的協(xié)議名稱。比如,在SSL Connector上可能將這個屬性設(shè)為“https”。缺省值為“http”,更多信息,參考SSL支持

secure

如果希望在該Connector接收到的請求上調(diào)用request.isSecure()返回true,設(shè)置該屬性為true。缺省值為false。

標(biāo)準(zhǔn)實(shí)現(xiàn)

Coyote HTTP/1.1 Connector 的標(biāo)準(zhǔn)實(shí)現(xiàn)是org.apache.coyote. tomcat 5.CoyoteConnector。它還支持如下的附加屬性

屬性 描述
acceptCount

當(dāng)所有可能的請求處理線程都被使用的時候,連接請求隊(duì)列的最大長度。如果該隊(duì)列為滿,所有的請求都被拒絕,缺省值為10。

address 對于具有多個IP地址的server,這個屬性指定了用于監(jiān)聽特定端口的地址。缺省情況下,端口作用于server的所有IP地址。
bufferSize

connector創(chuàng)建的輸入流緩沖區(qū)的 大小 (以字節(jié)為單位)。缺省情況下,bufferSize=2048。

compression

為 了節(jié)省服務(wù)器帶寬,Connector可能使用HTTP/1.1 GZIP 壓縮。這個參數(shù)的可接受值為“off”(不使用壓縮),“on”(壓縮文本數(shù)據(jù)),“force”(在所有的情況下強(qiáng)制壓縮),或者使用一個數(shù)值 整數(shù)(等價(jià)于“on”,但是指定了輸出被壓縮是的最小的數(shù)據(jù)數(shù))。如果content-length未知, 而compression設(shè)置成“on”或者 更強(qiáng),輸出也會被壓縮。如果沒有指定,這個屬性被設(shè)成“off”

connectionLinger

當(dāng)Connector使用的socket被關(guān)閉的時候,保留該socket的時間,以毫秒為單位。缺省值為-1(不使用socket linger)

connectionTimeout

在Connector接受一個連接以后,等待發(fā)生第一個請求的時間,以毫秒為單位。缺省值為60000(60秒)

debug

日志消息的詳細(xì)程度,數(shù)字越大,輸出越詳細(xì),如果沒有指定,使用缺省值0。

disableUploadTimeout 這個標(biāo)志允許servlet container在一個servlet執(zhí)行的時候,使用一個不同的,更長的連接超時。最終的結(jié)果是給servlet更長的時間以便完成其執(zhí)行,或者在數(shù)據(jù)上載的時候更長的超時時間。如果沒有指定,設(shè)為false。
maxKeepAliveRequests 在server關(guān)閉連接之前,接受的HTTP請求的最大數(shù)目。如果該值設(shè)為1,會禁止HTTP/1.0保活,同時也會禁止HTTP/1.1保活和pipelining。如果沒有指定,設(shè)為100。
maxSpareThreads

在線程池開始停止不必要的線程之前,允許存在的最大未使用的請求處理線程。缺省值為50。

?

maxThreads

Connector能夠創(chuàng)建的最大請求處理線程數(shù),這個值決定了同時能夠處理的最大請求數(shù)。如果沒有指定,缺省值為200。

minSpareThreads

當(dāng)Connector第一次啟動時,創(chuàng)建的請求處理線程數(shù)。connector同時必須保證指定數(shù)目的空閑處理線程。這個值應(yīng)該設(shè)置成比maxThreads小的數(shù)值,缺省值為4。

port

Connector創(chuàng)建server socket并等待連接的TCP端口號。操作系統(tǒng)在特定的IP地址上只允許一個服務(wù)器應(yīng)用程序監(jiān)聽特定的端口。

protocol

為了使用HTTP處理器,該屬性值必須為HTTP/1.1(缺省值)

proxyName

如果connector在代理配置中使用,將這個屬性設(shè)置成調(diào)用request.getServerName()時返回的服務(wù)器名稱。更多信息參考代理支持。

proxyPort

如果Connector在代理配置中使用,這個屬性指定了調(diào)用request.getServerPort()返回的端口值。更多信息參考代理支持。

socketBuffer

socket輸出緩沖區(qū)的 大小 。如果為-1,不使用緩沖。缺省值為9000字節(jié)。

tcpNoDelay

如果為true,服務(wù)器socket會設(shè)置TCP_NO_DELAY選項(xiàng),在大多數(shù)情況下可以提高性能。缺省情況下設(shè)為true。

嵌套組件

可以嵌套在Connector中的唯一元素是Factory,用來配置服務(wù)器套接口工廠組件。這個組件從來都不需要,現(xiàn)在支持這個組件是為了與 Tomcat 的早期版本兼容。

專有特征
HTTP/1.1 和HTTP/1.0 支持

Connector 支持HTTP/1.1協(xié)議的所有必需特征(如RFC2616所描述的),包括永久性連接,流水線,expectations and chunked encoding。如果客戶端(通常是一個瀏覽器)只支持HTTP/1.0,Connector會自動跳回到HTTP/1.0。不需要特殊的配置來使能這 個支持。Connector也支持HTTP/1.0保活機(jī)制。

RFC2616要求HTTP服務(wù)器的響應(yīng)總是以它們宣稱支持的最高HTTP版本開始。因此,這個Connector在它的響應(yīng)的開始總是返回HTTP/1.1。

?

日志輸出

Connector產(chǎn)生的任何調(diào)試或者異常信息都會被自動路由到與Connector所屬的Engine的Logger。不需要特殊的配置來使能這個支持。

?

代理支持
Tomcat 位于代理服務(wù)器后面時,可以使用proxyName和proxyPort屬性。這些屬性修改了調(diào)用 requset.getServerName()和request.getServerPort()的返回值,用來構(gòu)造重定向的絕對URL。如果不設(shè)置這 些值,返回值反映了代理服務(wù)器收到的連接的服務(wù)器名稱和端口號,而不是客戶端發(fā)起的服務(wù)器名稱和端口號。

更多信息,參考代理支持HOW-TO

SSL支持

對Connector的特定實(shí)例,可以將secure屬性設(shè)為true,來使能SSL支持。另外,可以配置如下屬性:

?

屬性 描述
algorithm

使用的認(rèn)證編碼算法。缺省值為SunX509。

?

clientAuth

如果在接受某個連接之前,需要客戶端發(fā)送有效證書鏈,將該值設(shè)為true。如果為false(缺省值),不需要使用證書鏈。除非客戶端請求被CLIENT-CERT認(rèn)證保護(hù)的資源。

?

keystoreFile

存儲服務(wù)器證書的keystore文件路徑。缺省情況下,路徑指向運(yùn)行 Tomcat 的用戶主目錄下的".keystore"。

?

keystorePass

用來訪問服務(wù)器證書的密碼,缺省值未"changeit"

?

keystoreType

用于存儲服務(wù)器證書的keystore文件的類型。缺省值未"JKS"

?

sslProtocol

SSL協(xié)議的版本號,缺省值是TLS

?

ciphers

可以使用的加密算法列表,用逗號分開。如果沒有指定,可以使用任何算法。

?

?

?

[ Tomcat 源碼系列] Tomcat Connector

Connector是 Tomcat 最核心的組件之一,負(fù)責(zé)處理一個WebServer最核心的連接管理、Net IO、線程(可選)、協(xié)議解析和處理的工作。
一、連接器介紹
在開始Connector探索之路之前,先看看Connector幾個關(guān)鍵字
  • NIO: Tomcat 可以利用Java比較新的NIO技術(shù),提升高并發(fā)下的Socket性能
  • AJP:Apache JServ Protocol,AJP的提出當(dāng)然還是為了解決java亙古不變的問題——性能,AJP協(xié)議是基于包的長連接協(xié)議,以減少前端Proxy與 Tomcat 連接Socket連接創(chuàng)建的代價(jià),目前Apache通過JK和AJP_ROXY的方式支持AJP協(xié)議,需要注意的是,雖然Nginx作為代理服務(wù)器性能強(qiáng)勁,但其只能通過HTTP PROXY的方式與后端的 Tomcat 聯(lián)系,因此如果從作為代理服務(wù)器的角度上講,在這種情況下Nginx未必會比Apache體現(xiàn)出更優(yōu)的性能
  • APR/Native:Apache Portable Runtime,還是一個詞,性能。APR的提出利用Native代碼更好地解決性能問題,更好地與本地服務(wù)器(linux)打交道。讓我們看看 Tomcat 文檔對APR的介紹
Tomcat 6文檔 寫道
Tomcat can use the Apache Portable Runtime to provide superior scalability, performance, and better integration with native server technologies. The Apache Portable Runtime is a highly portable library that is at the heart of Apache HTTP Server 2.x. APR has many uses, including access to advanced IO functionality (such as sendfile, epoll and OpenSSL), OS level functionality (random number generation, system status, etc), and native process handling (shared memory, NT pipes and Unix sockets). These features allows making Tomcat a general purpose webserver, will enable much better integration with other native web technologies, and overall make Java much more viable as a full fledged webserver platform. rather than simply a backend focused technology.

通過對如上名詞的組合, Tomcat 組成了如下的Connector系列:

  • Http11Protocol:支持HTTP1.1協(xié)議的連接器
  • Http11NioProtocol:支持HTTP1.1 協(xié)議+ NIO的連接器
  • Http11AprProtocol:使用APR技術(shù)處理連接的連接器
  • AjpProtocol:支持AJP協(xié)議的連接器
  • AjpAprProtocol:使用APR技術(shù)處理連接的連接器

二、范例 ????? 我們以最簡單的Http11Protocol為例,看看從請求進(jìn)來到處理完畢,連接器部件是處理處理的。首先我們利用 Tomcat 組件組成我們一個最簡單的WebServer,其具備如下功能:

  • 監(jiān)停某個端口,接受客戶端的請求,并將請求分配給處理線程
  • 處理線程處理請求,分析HTTP1.1請求,封裝Request/Response對象,并將請求由請求處理器處理
  • 實(shí)現(xiàn)最簡單的請求處理器,向客戶端打印Hello World

代碼非常簡單,首先是主功能(這里,我們利用JDK5.0的線程池,連接器不再管理線程功能):

Java代碼
  1. package ray. tomcat .test;??
  2. ?
  3. import java.util.concurrent.BlockingQueue;??
  4. import java.util.concurrent.LinkedBlockingQueue;
  5. import java.util.concurrent.ThreadPoolExecutor;
  6. import java.util.concurrent.TimeUnit;??
  7. ?
  8. import org.apache.coyote.http11.Http11Protocol;
  9. ?
  10. public class Tomcat MainV2??
  11. {??
  12. ??? public static void main(String[] args) throws Exception??
  13. ??? {??
  14. ??????? Http11Protocol protocol = new Http11Protocol();
  15. ??????? protocol.setPort( 8000 );??
  16. ??????? ThreadPoolExecutor threadPoolExecutor = createThreadPoolExecutor();
  17. ??????? threadPoolExecutor.prestartCoreThread();
  18. ??????? protocol.setExecutor(threadPoolExecutor);
  19. ??????? protocol.setAdapter( new MyHandler());
  20. ??????? protocol.init();??
  21. ??????? protocol.start();??
  22. ??? }??
  23. ?
  24. ??? public static ThreadPoolExecutor createThreadPoolExecutor()
  25. ??? {??
  26. ??????? int corePoolSize = 2 ;
  27. ??????? int maximumPoolSize = 10 ;??
  28. ??????? long keepAliveTime = 60 ;??
  29. ??????? TimeUnit unit = TimeUnit.SECONDS;??
  30. ??????? BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();??
  31. ??????? ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
  32. ??????????????? corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
  33. ??????? return threadPoolExecutor;??
  34. ??? }??
  35. }?

請求處理器向客戶端打引Hello World,代碼如下

Java代碼
  1. package ray. tomcat .test;??
  2. ?
  3. import java.io.ByteArrayOutputStream;??
  4. import java.io.OutputStreamWriter;??
  5. import java.io.PrintWriter;??
  6. ?
  7. import org.apache.coyote.Adapter;??
  8. import org.apache.coyote.Request;??
  9. import org.apache.coyote.Response;??
  10. import org.apache. tomcat .util.buf.ByteChunk;??
  11. import org.apache. tomcat .util.net.SocketStatus;??
  12. ?
  13. public class MyHandler implements Adapter
  14. {??
  15. ??? //支持Comet,Servlet3.0將對Comet提供支持, Tomcat 6目前是非標(biāo)準(zhǔn)的實(shí)現(xiàn) ?
  16. ??? public boolean event(Request req, Response res, SocketStatus status)
  17. ??????????? throws Exception??
  18. ??? {??
  19. ??????? System.out.println( "event" );??
  20. ??????? return false ;??
  21. ??? }??
  22. ?
  23. ??? //請求處理 ?
  24. ??? public void service(Request req, Response res) throws Exception??
  25. ??? {??
  26. ??????? System.out.println( "service" );??
  27. ?
  28. ??????? ByteArrayOutputStream baos = new ByteArrayOutputStream();??
  29. ??????? PrintWriter writer = new PrintWriter( new OutputStreamWriter(baos));??
  30. ??????? writer.println( "Hello World" );??
  31. ??????? writer.flush();??
  32. ?
  33. ??????? ByteChunk byteChunk = new ByteChunk();??
  34. ??????? byteChunk.append(baos.toByteArray(), 0 , baos.size());??
  35. ??????? res.doWrite(byteChunk);??
  36. ??? }?????
  37. }?

???? 運(yùn)行主程序,在瀏覽器中輸入http://127.0.0.1:8000,我們可以看到打印”Hello World” 三、分析 ???? 以如上Http11Protocol為例,我們可以看到, Tomcat 實(shí)現(xiàn)一個最簡單的處理Web請求的代碼其實(shí)非常簡單,其主要包括如下核心處理類:

  • Http11Protocol:Http1.1協(xié)議處理入口類,其本身沒有太多邏輯,對請求主要由JIoEndPoint類處理
  • Http11Protocol$Http11ConnectionHandler:連接管理器,管理連接處理隊(duì)列,并分配Http11Processor對請求進(jìn)行處理
  • Http11Processor:請求處理器,負(fù)責(zé)HTTP1.0協(xié)議相關(guān)的工作,包括解析請求和處理響應(yīng)信息,并調(diào)用Adapter做實(shí)際的處理工作,如上我們看到了我們自定義的Adapter實(shí)現(xiàn)響應(yīng)”Hello World”
  • JIoEndPoint:監(jiān)停端口,啟動接受線程準(zhǔn)備接收請求,在請求接受后轉(zhuǎn)給工作線程處理
  • JIoEndPoint$Acceptor:請求接收器,接收后將Socket分配給工作線程繼續(xù)后續(xù)處理
  • JIoEndPoint$Worker:工作線程,使用Handler來處理請求,對于我們的HTTP1.1協(xié)議來說,其實(shí)現(xiàn)是Http11Protocol$Http11ConnectionHandler。這部分不是必須的,也可以選擇JDK的concurrent包的線程池

????? 實(shí)際上各種連接器實(shí)現(xiàn)基本大同小異,基本上都是由如上部分組合而成

????? 1.初始化:首先,還是從入口開始,先看看初始化init

Java代碼
  1. public void init() throws Exception {
  2. ??????? endpoint.setName(getName());??
  3. ??????? endpoint.setHandler(cHandler); //請求處理器,對于HTTP1.1協(xié)議,是Http11Protocol$Http11ConnectionHandler ?
  4. ?
  5. ?????????
  6. // 初始化ServerSocket工廠類,如果需SSL/TLS支持,使用JSSESocketFactory/PureTLSSocketFactory ?
  7. . . . (略)?????????
  8. ????????????? //主要的初始化過程實(shí)際是在endpoint(JIoEndpoint) ?
  9. ??????? endpoint.init();??
  10. ??????? . . . (略)??
  11. ??? }?

????? Http11Protocol的初始化非常簡單,準(zhǔn)備好ServerSocket工廠,調(diào)用JIoEndPoint的初始化。讓我們接下來看看JIoEndPoint的初始化過程

Java代碼
  1. public void init()??
  2. ??????? throws Exception {??
  3. ?
  4. ??????? if (initialized)??
  5. ??????????? return ;??
  6. ?????????
  7. ??????? // Initialize thread count defaults for acceptor ?
  8. ??????? // 請求接收處理線程,這個值實(shí)際1已經(jīng)足夠 ?
  9. ??????? if (acceptorThreadCount == 0 ) {??
  10. ??????????? acceptorThreadCount = 1 ;??
  11. ??????? }??
  12. ??????? if (serverSocketFactory == null ) {??
  13. ??????????? serverSocketFactory = ServerSocketFactory.getDefault();
  14. ??????? }??
  15. ?????????
  16. ??????? //創(chuàng)建監(jiān)停ServerSocket,port為監(jiān)聽端口,address為監(jiān)停地址 ?
  17. ??????? // backlog為連接請求隊(duì)列容量(@param backlog how many connections are queued) ?
  18. ??????? if (serverSocket == null ) {??
  19. ??????????? try {??
  20. ??????????????? if (address == null ) {??
  21. ??????????????????? serverSocket = serverSocketFactory.createSocket(port, backlog);
  22. ??????????????? } else {??
  23. ??????????????????? serverSocket = serverSocketFactory.createSocket(port, backlog, address);
  24. ??????????????? }??
  25. ??????????? } catch (BindException be) {??
  26. ??????????????? throw new BindException(be.getMessage() + ":" + port);??
  27. ??????????? }??
  28. ??????? }??
  29. ??????? //if( serverTimeout >= 0 ) ?
  30. ??????? //??? serverSocket.setSoTimeout( serverTimeout ); ?
  31. ?????????
  32. ??????? initialized = true ;????
  33. ??? }?

??????? 可以看到,監(jiān)停端口在此處準(zhǔn)備就緒

Java代碼
  1. public void start()??
  2. ???? throws Exception {??
  3. ???? // Initialize socket if not done before ?
  4. ???? if (!initialized) {??
  5. ???????? init();??
  6. ???? }??
  7. ???? if (!running) {??
  8. ???????? running = true ;??
  9. ???????? paused = false ;??
  10. ?
  11. ???????? // Create worker collection ?
  12. ???????? // 初始化工作線程池,有WorkerStack( Tomcat 自實(shí)現(xiàn))和Executor(JDK concurrent包)兩種實(shí)現(xiàn) ?
  13. ???????? if (executor == null ) {??
  14. ???????????? workers = new WorkerStack(maxThreads);??
  15. ???????? }??
  16. ?
  17. ???????? // Start acceptor threads ?
  18. ???????? // 啟動請求連接接收處理線程 ?
  19. ???????? for ( int i = 0 ; i < acceptorThreadCount; i++) {??
  20. ???????????? Thread acceptorThread = new Thread( new Acceptor(), getName() + "-Acceptor-" + i);??
  21. ???????????? acceptorThread.setPriority(threadPriority);
  22. ???????????? acceptorThread.setDaemon(daemon); //設(shè)置是否daemon參數(shù),默認(rèn)為true ?
  23. ???????????? acceptorThread.start();??
  24. ???????? }??
  25. ???? }??
  26. }?

????? 2.準(zhǔn)備好連接處理:初始化完畢,準(zhǔn)備好連接處理,準(zhǔn)備接收連接上來,同樣的,Http11Protocol的start基本沒干啥事,調(diào)用一下JIoEndPoint的start,我們來看看JIoEndPoint的start

Java代碼
  1. public void start()??
  2. ???? throws Exception {??
  3. ???? // Initialize socket if not done before ?
  4. ???? if (!initialized) {??
  5. ???????? init();??
  6. ???? }??
  7. ???? if (!running) {??
  8. ???????? running = true ;??
  9. ???????? paused = false ;??
  10. ?
  11. ???????? // Create worker collection ?
  12. ???????? // 初始化工作線程池,有WorkerStack( Tomcat 自實(shí)現(xiàn))和Executor(JDK concurrent包)兩種實(shí)現(xiàn) ?
  13. ???????? if (executor == null ) {??
  14. ???????????? workers = new WorkerStack(maxThreads);??
  15. ???????? }??
  16. ?
  17. ???????? // Start acceptor threads ?
  18. ???????? // 啟動請求連接接收處理線程 ?
  19. ???????? for ( int i = 0 ; i < acceptorThreadCount; i++) {??
  20. ???????????? Thread acceptorThread = new Thread( new Acceptor(), getName() + "-Acceptor-" + i);??
  21. ???????????? acceptorThread.setPriority(threadPriority);
  22. ???????????? acceptorThread.setDaemon(daemon); //設(shè)置是否daemon參數(shù),默認(rèn)為true ?
  23. ???????????? acceptorThread.start();??
  24. ???????? }??
  25. ???? }??
  26. }?

????? 主要處理的事情無非就是準(zhǔn)備和工作線程(處理具體請求的線程度池,可選,也可以使用JDK5.0的線程池),連接請求接收處理線程(代碼中,一般acceptorThreadCount=1)

????? 3.連接請求接收處理:準(zhǔn)備就緒,可以連接入請求了。現(xiàn)在工作已經(jīng)轉(zhuǎn)到了Acceptor(JIoEndPoint$Acceptor)這里,我們看看Acceptor到底做了些啥

Java代碼
  1. public void run() {??
  2. ?
  3. ??????????? // Loop until we receive a shutdown command ?
  4. ??????????? while (running) {
  5. ??????????????? . . . (略)??
  6. ??????????????????? //阻塞等待客戶端連接 ?
  7. ??????????????????? Socket socket = serverSocketFactory.acceptSocket(serverSocket);
  8. ??????????????????? serverSocketFactory.initSocket(socket);
  9. ??????????????????? // Hand this socket off to an appropriate processor ?
  10. ??????????????????? if (!processSocket(socket)) {??
  11. ??????????????????????? // Close socket right away ?
  12. ??????????????????????? try {??
  13. ??????????????????????????? socket.close();
  14. ??????????????????????? } catch (IOException e) {
  15. ??????????????????????????? // Ignore ?
  16. ??????????????????????? }??
  17. ??????????????????? }??
  18. ????????????????? . . . (略)??
  19. ??????????? }??
  20. }??
  21. . . . (略)??
  22. ??? protected boolean processSocket(Socket socket) {??
  23. ??????? try {??
  24. ??????????? //由工作線程繼續(xù)后續(xù)的處理 ?
  25. ??????????? if (executor == null ) {??
  26. ??????????????? getWorkerThread().assign(socket);
  27. ??????????? } else {??
  28. ??????????????? executor.execute( new SocketProcessor(socket));??
  29. ??????????? }??
  30. ??????? } catch (Throwable t) {??
  31. ??????????? . . . (略)?????????????
  32. return false ;??
  33. ??????? }??
  34. ??????? return true ;??
  35. ??? }?

?????? 實(shí)際上也沒有什么復(fù)雜的工作,無非就是有連接上來之后,將連接轉(zhuǎn)交給工作線程(SocketProcessor)去處理

?????? 4.工作線程:SocketProcessor

Java代碼
  1. public void run() {??
  2. ??????????? // Process the request from this socket ?
  3. ??????????? if (!setSocketOptions(socket) || !handler.process(socket)) {
  4. ??????????????? // Close socket ?
  5. ??????????????? try {??
  6. ??????????????????? socket.close();??
  7. ??????????????? } catch (IOException e) {
  8. ??????????????? }??
  9. ??????????? }??
  10. ??????????? // Finish up this request ?
  11. ??????????? socket = null ;??
  12. ??????? }????

??? 工作線程主要是設(shè)置一下Socket參數(shù),然后將請求轉(zhuǎn)交給handler去處理,需要注意一下如下幾個連接參數(shù)的意義:

  • SO_LINGER:若設(shè)置了SO_LINGER并確定了非零的超時間隔,則closesocket()調(diào)用阻塞進(jìn)程,直到所剩數(shù)據(jù)發(fā)送完畢或超時。這種關(guān)閉稱為“優(yōu)雅的”關(guān) 閉。請注意如果套接口置為非阻塞且SO_LINGER設(shè)為非零超時,則closesocket()調(diào)用將以WSAEWOULDBLOCK錯誤返回。若在一個流類套接口上設(shè)置了SO_DONTLINGER,則closesocket()調(diào)用立即返回。但是,如果可能,排隊(duì)的數(shù)據(jù)將在套接口關(guān)閉前發(fā)送。請注意,在這種情況下WINDOWS套接口實(shí)現(xiàn)將在 一段不確定的時間內(nèi)保留套接口以及其他資源(TIME_WAIT),這對于想用所以套接口的應(yīng)用程序來說有一定影響。默認(rèn)此參數(shù)不打開
  • TCP_NODELAY:是否打開Nagle,默認(rèn)打開,使用Nagle算法是為了避免多次發(fā)送小的分組,而是累計(jì)到一定程度或者超過一定時間后才一起發(fā)送。對于AJP連接,可能需要關(guān)注一下這個選項(xiàng)。
  • SO_TIMEOUT:JDK API注釋如下,With this option set to a non-zero timeout,a read() call on the InputStream associated with this Socket will block for only this amount of time.? If the timeout expires, a java.net.SocketTimeoutException is raised, though the Socket is still valid. The option must be enabled prior to entering the blocking operation to have effect. The timeout must be > 0。默認(rèn)設(shè)置的是60秒

??????? 關(guān)于默認(rèn)的設(shè)置,可以參見org.apache.coyote.http11.Constants定義 ????? 5.最終請求終于回到了Handler,此處的Handler實(shí)現(xiàn)是org.apache.coyote.http11.Http11Processor,其主要處理一些HTTP協(xié)議性細(xì)節(jié)的東西,此處代碼不再列出,有興趣可以自行讀代碼。最終請求終于回到了我們的Adapter對象,一個請求處理完畢,功德圓滿。

來源: http://1632004.blog.163.com/blog/static/29991497201201912858468/

Tomcat服務(wù)器配置參考


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲一区亚洲二区 | 亚洲 欧美 另类中文字幕 | 天天操狠狠操夜夜操 | 欧美一区二区在线观看 | 国产精品亚洲欧美 | 欧美影院一区二区三区 | 亚洲成人欧美 | 最近中文字幕无吗免费视频 | 国产精品免费看久久久香蕉 | 在线视频久久 | 国产91在线 | 欧美 | 五月天婷婷激情视频 | 毛片一级在线观看 | 日韩欧美在线中文字幕 | 够爱久久| 末成年一级在线看片 | 日本一级爽毛片在线看 | 国产精品欧美亚洲韩国日本不卡 | 波多野一区二区三区在线 | 国产成人免费不卡在线观看 | 亚洲第一区二区快射影院 | 亚洲精品综合久久 | 人人看人人鲁狠狠高清 | 欧美另类精品 | 天天操天天干天天射 | 久久这里只有精品免费的 | 精品国产一区二区麻豆 | 国产精品九九久久精品女同 | 国产女人伦码一区二区三区不卡 | 欧美性猛交xxxxxxxx软件 | 99久久精品免费看国产情侣 | 久久精品成人免费看 | 国产一级做a爱片久久毛片a | 91在线小视频 | 五月婷婷久 | 亚洲日韩精品欧美一区二区一 | 久久99国产乱子伦精品免费 | 久久久久一级片 | 奇米第一色 | 久久久久久久久久爱 | 精品久久久久久中文字幕2017 |