日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Tomcat處理http請求之源碼分析

瀏覽:282日期:2023-09-08 20:45:27
目錄1 請求包裝處理2 請求傳遞給Container3 Container處理請求流程1 請求包裝處理

tomcat組件Connector在啟動的時候會監聽端口。以JIoEndpoint為例,在其Acceptor類中:

protected class Acceptor extends AbstractEndpoint.Acceptor { @Override public void run() {while (running) { …… try {//當前連接數countUpOrAwaitConnection();Socket socket = null;try { //取出隊列中的連接請求 socket = serverSocketFactory.acceptSocket(serverSocket);} catch (IOException ioe) { countDownConnection();}if (running && !paused && setSocketOptions(socket)) { //處理請求 if (!processSocket(socket)) {countDownConnection();closeSocket(socket); }} else { countDownConnection(); // Close socket right away closeSocket(socket);} } ……} }}

在上面的代碼中,socket = serverSocketFactory.acceptSocket(serverSocket);與客戶端建立連接,將連接的socket交給processSocket(socket)來處理。在processSocket中,對socket進行包裝一下交給線程池來處理:

protected boolean processSocket(Socket socket) { try {SocketWrapper<Socket> wrapper = new SocketWrapper<Socket>(socket);wrapper.setKeepAliveLeft(getMaxKeepAliveRequests());wrapper.setSecure(isSSLEnabled());//交給線程池處理連接getExecutor().execute(new SocketProcessor(wrapper)); } …… return true;}

線程池處理的任務SocketProccessor,通過代碼分析:

protected class SocketProcessor implements Runnable { protected SocketWrapper<Socket> socket = null; protected SocketStatus status = null; @Override public void run() {boolean launch = false;synchronized (socket) { SocketState state = SocketState.OPEN; try {serverSocketFactory.handshake(socket.getSocket()); } …… if ((state != SocketState.CLOSED)) {//委派給Handler來處理if (status == null) { state = handler.process(socket, SocketStatus.OPEN_READ);} else { state = handler.process(socket,status);} }}} ……}

即在SocketProcessor中,將Socket交給handler處理,這個handler就是在Http11Protocol的構造方法中賦值的Http11ConnectionHandler,在該類的父類process方法中通過請求的狀態,來創建Http11Processor處理器進行相應的處理,切到Http11Proccessor的父類AbstractHttp11Proccessor中。

public SocketState process(SocketWrapper socketWrapper) { RequestInfo rp = request.getRequestProcessor(); rp.setStage(org.apache.coyote.Constants.STAGE_PARSE); // Setting up the I/O setSocketWrapper(socketWrapper); getInputBuffer().init(socketWrapper, endpoint); getOutputBuffer().init(socketWrapper, endpoint); while (!getErrorState().isError() && keepAlive && !comet && !isAsync() && upgradeInbound == null && httpUpgradeHandler == null && !endpoint.isPaused()) {……if (!getErrorState().isError()) { // Setting up filters, and parse some request headers rp.setStage(org.apache.coyote.Constants.STAGE_PREPARE); try {//請求預處理prepareRequest(); } ……}……if (!getErrorState().isError()) { try {rp.setStage(org.apache.coyote.Constants.STAGE_SERVICE);//交由適配器處理adapter.service(request, response);if(keepAlive && !getErrorState().isError() && (response.getErrorException() != null ||(!isAsync() &&statusDropsConnection(response.getStatus())))) { setErrorState(ErrorState.CLOSE_CLEAN, null);}setCometTimeouts(socketWrapper); } } } ……}

可以看到Request和Response的生成,從Socket中獲取請求數據,keep-alive處理,數據包裝等等信息,最后交給了CoyoteAdapter的service方法

2 請求傳遞給Container

在CoyoteAdapter的service方法中,主要有2個任務:

•第一個是org.apache.coyote.Request和org.apache.coyote.Response到繼承自HttpServletRequest的org.apache.catalina.connector.Request和org.apache.catalina.connector.Response轉換,和Context,Wrapper定位。

•第二個是將請求交給StandardEngineValve處理。

public void service(org.apache.coyote.Request req,org.apache.coyote.Response res) { …… postParseSuccess = postParseRequest(req, request, res, response); …… connector.getService().getContainer().getPipeline().getFirst().invoke(request, response); ……}

在postParseRequest方法中代碼片段:

connector.getMapper().map(serverName, decodedURI, version, request.getMappingData());request.setContext((Context) request.getMappingData().context);request.setWrapper((Wrapper) request.getMappingData().wrapper);

request通過URI的信息找到屬于自己的Context和Wrapper。而這個Mapper保存了所有的容器信息,不記得的同學可以回到Connector的startInternal方法中,最有一行代碼是mapperListener.start(); 在MapperListener的start()方法中,

public void startInternal() throws LifecycleException { setState(LifecycleState.STARTING); findDefaultHost(); Engine engine = (Engine) connector.getService().getContainer(); addListeners(engine); Container[] conHosts = engine.findChildren(); for (Container conHost : conHosts) {Host host = (Host) conHost;if (!LifecycleState.NEW.equals(host.getState())) { registerHost(host);} }}

MapperListener.startInternal()方法將所有Container容器信息保存到了mapper中。那么,現在初始化把所有容器都添加進去了,如果容器變化了將會怎么樣?這就是上面所說的監聽器的作用,容器變化了,MapperListener作為監聽者。他的生成圖示

通過Mapper找到了該請求對應的Context和Wrapper后,CoyoteAdapter將包裝好的請求交給Container處理。

3 Container處理請求流程

從下面的代碼片段,我們很容易追蹤整個Container的調用鏈: 用時序圖畫出來則是:

最終StandardWrapperValve將請求交給Servlet處理完成。至此一次http請求處理完畢。

到此這篇關于Tomcat處理http請求之源碼分析的文章就介紹到這了,更多相關Tomcat請求處理內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Tomcat
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久超碰99| 欧美交a欧美精品喷水| 亚洲专区视频| 91精品国产91久久久久久黑人| 国产欧美高清| 日韩一区二区三区精品| 国产精品女主播一区二区三区| 成年男女免费视频网站不卡| 亚洲理论在线| 中文亚洲免费| 好吊一区二区三区| 91精品高清| 欧美日韩在线播放视频| 日韩一区电影| 波多视频一区| 国产成人免费精品| 国产精品一国产精品k频道56| 日韩精品一级二级| 国产精品美女久久久浪潮软件| 欧美va天堂| 欧美日韩一二三四| 久久网站免费观看| 亚洲婷婷在线| 免费看av不卡| 不卡福利视频| 色偷偷偷在线视频播放| 国产资源在线观看入口av| 国产成人精品一区二区三区视频| 久久在线91| 国产成人精品一区二区三区免费| 加勒比视频一区| 麻豆视频在线看| 色老板在线视频一区二区| 久久久久.com| 久久久蜜桃一区二区人| 久久久一二三| 亚洲成人三区| 亚洲视频播放| 免费视频亚洲| 亚洲一区网站| 一区二区三区网站| 亚洲精品第一| 久久国产人妖系列| 久久69成人| 日韩免费久久| 亚洲激精日韩激精欧美精品| 男人天堂欧美日韩| 中文字幕亚洲在线观看| 日本伊人久久| 国产精品久久国产愉拍| 国产aa精品| 色天使综合视频| 婷婷综合五月| 亚洲男女自偷自拍| 日韩毛片一区| 久久精品国产亚洲一区二区三区| 国产精品主播| 亚洲精品乱码久久久久久蜜桃麻豆 | 成人国产精品一区二区网站| 国产成人精品亚洲日本在线观看| 蜜桃成人av| 亚洲精品美女91| 精品福利久久久| 99久久精品网| 石原莉奈一区二区三区在线观看 | 欧美伊人影院| 国产精品99在线观看| 极品日韩av| 一本色道久久精品| 免费看日韩精品| 日本99精品| 日韩成人a**站| 在线综合欧美| 69精品国产久热在线观看| 国产一区二区三区四区| 婷婷成人综合| 四虎精品一区二区免费| 欧美a级一区二区| 欧美一级精品| 亚洲欧美在线综合| 卡一精品卡二卡三网站乱码| 久久在线视频免费观看| 深夜福利一区| 毛片在线网站| 六月天综合网| 精品国产精品久久一区免费式| 久久久久国产一区二区| 日韩一区二区三区精品| 国产福利电影在线播放| 一区二区亚洲视频| 中文在线а√天堂| 亚洲毛片视频| 综合日韩av| 日韩区欧美区| 韩国久久久久久| 亚洲免费资源| 国产福利电影在线播放| 丝袜a∨在线一区二区三区不卡| 日本不卡一区二区三区| av日韩中文| 日本欧美久久久久免费播放网| 日韩精品免费一区二区三区| 欧美日韩国产一区二区在线观看| 亚洲福利免费| 久久av导航| 免费国产亚洲视频| 成人片免费看| 久久国产婷婷国产香蕉| 欧美日韩精品一本二本三本| 国产精品视频一区二区三区综合| 欧美日韩黑人| 国产日韩欧美三区| 中文一区一区三区免费在线观 | 欧美日韩一区二区三区视频播放| 国产伦理久久久久久妇女| 老鸭窝一区二区久久精品| 91精品国产91久久久久久黑人| 日韩高清电影免费| 国产91一区| 久久这里只有| 蜜桃成人av| 日韩高清不卡在线| 成人av三级| 青青草精品视频| 婷婷综合激情| 蜜桃精品在线| 精品国产麻豆| 国产日韩欧美高清免费| 久久福利精品| 亚洲精品网址| 深夜视频一区二区| 成人亚洲一区| 久久精品网址| 国产精品久久久久久久免费软件| 奶水喷射视频一区| 国产一区二区中文| 日韩欧美字幕| 91视频一区| 日韩午夜视频在线| 亚洲欧美日韩专区| 欧美成人a交片免费看| 久久99精品久久久野外观看| 中文欧美日韩| 蜜臀av免费一区二区三区| 日韩高清不卡| 一本大道色婷婷在线| 精品女同一区二区三区在线观看| 国产欧美在线| 五月国产精品| 深夜福利一区| 中文字幕一区二区三区在线视频| 黄色在线一区| 亚洲精品888| 三级小说欧洲区亚洲区| 日韩一区自拍| 精精国产xxxx视频在线播放| 欧美天堂视频| 亚洲www啪成人一区二区| 日韩伦理在线一区| 日韩三级一区| 91麻豆精品激情在线观看最新 | 国产精品久久久久久久久久齐齐| 国产亚洲久久| 麻豆精品少妇| 国内精品亚洲| 精品欠久久久中文字幕加勒比| 国产精品成人3p一区二区三区| 国产精品chinese| 日韩av片子| 久久高清精品| 亚洲欧美日韩国产一区| 视频一区日韩| 视频一区中文字幕精品| 亚洲毛片在线免费| 欧美精品资源| 日韩电影在线视频| 亚洲手机视频| 久热精品在线| 日本综合精品一区| 国产精品videosex极品| 亚洲精品亚洲人成在线观看| 欧美亚洲激情| 午夜在线播放视频欧美| 激情欧美一区二区三区| 国产精品久av福利在线观看| 国产日产精品_国产精品毛片| 日韩一区二区免费看| 在线国产日韩| 日本aⅴ精品一区二区三区| 91免费精品| 黄色av一区| 欧美一区不卡| 正在播放日韩精品| 黑丝一区二区三区| 婷婷综合国产| 国产欧美一区二区三区国产幕精品| 精品视频高潮| 不卡视频在线| 日韩动漫一区| 国产传媒av在线|