jetty分析

路徑:

jetty-http、jetty-io、jetty-client、jetty-server

文檔:

http://www.eclipse.org/jetty/documentation/9.4.7.v20170914/

https://yq.aliyun.com/articles/46916

 

1. jetty-http: http接口化模型定義&序列化(解析、構造)

            

2. jetty-io: 處理網絡連接

         兩條線:連接的建立過程、讀寫處理過程

 

  • 連接的建立過程

AbstractConnector.Acceptor.run->ServerConnector.accept->ServerConnector.accepted->SelectorManager.accept->ManagedSelector.

submit->ManagedSelector._actions(ManagedSelector.Accept)

 
ManagedSelector.Accept.run ->ManagedSelector._actions(CreateEndPoint)

 

 

  •  
  •   讀寫處理過程

 

  • selectorManager

任務提交到 managerdSelector,managerdSelector中的_strategy會被執行,執行連接任務,各個action

 

3. client:

 

 

HttpClient.send(HttpRequest)
	-> HttpDestination.send(HttpRequest,ResponseListener) 
	-> HttpDestination.exchanges


HttpDestination.process(connection)
	->HttpDestinationOverHTTP.send(Connection, HttpExchange)
	->HttpConnectionOverHTTP.send(HttpExchange)


HttpConnectionOverHTTP.send(HttpExchange)
	->HttpConnectionOverHTTP.Delegate.send(HttpExchange)->HttpConnection.send(HttpChannel , HttpExchange )
	->HttpChannelOverHTTP.associate(HttpExchange)
	->HttpChannelOverHTTP.send()


HttpChannelOverHTTP.send(HttpExchange)
	->HttpSender.send(HttpExchange)->HttpSender.sendHeaders(exchange, content, CommitCallback)
	->HttpSenderOverHTTP.sendHeaders(exchange, content, CommitCallback)->HeadersCallback(exchange, content, callback).iterate()
	??HttpGenerator.generateRequest ,EndPoint.write()


sender 狀態機 !!!


IteratingCallback 機制!!! 有意識的思路
HttpGenerator機制!!


 

EndPoint機制!!

sender 狀態機 !!!


IteratingCallback 機制!!!


 
連接池管理:

 
version 8.1.x 

 

 

 

      使用Timeout實現超時管理邏輯,ConnectionIdleTask實現連接超時處理邏輯,HttpClient._threadPool完成調度執行。

_connections、_reservedConnections、_idleConnections 三個的關係

      連接的管理,隱含在各個操作中:

               getConnection,doSend,onConnectionFailed,returnConnection,returnIdleConnection會處理新建連接的操作;

               onNewConnection,returnConnection 操作,發現沒有緩存的exchange會將連接添加到idle池;

               ConnectionIdleTask.expired,send(AbstractHttpConnection, HttpExchange) 會處理idel超時的連接

               onNewConnection,returnConnection,doSend 會真正調用connection對象發送exchange;

               ??? 會返回連接

 

HttpClient:客戶端接口,對客戶提供功能

HttpDestination:管理到站點的連接

Connection:到站點的連接

Connector: 連接器??

Manager:管理多個SelectSet,啓動時候啓動個SelectSet.doSelect(SelectorManager.doStart)

SelectSet: 處理多個連接(endpoint)的多路Io複用邏輯

SelectChannelEndpoint: 封裝後端的socketChannel和AsyncHttpConnection,執行具體的socket操作

 

AsyncHttpConnection:執行發送請求和解析響應並回調(像是一個請求一個線程池任務),具體功能通過HttpGenerator、HttpParser實現;主要邏輯封裝再handle函數中,通過循環和狀態處理在一個函數中解決請求發送和響應解析的處理的邏輯(忒怪)

HttpGenerator:生成http請求報文、並通過endpoint發送到socket

HttpParser:解析http響應,並回調

 

3.1 建立連接

httpDestination.startNewConnection->connector.startConnection(destination)->selectorManager.register(socketChannel,destination)->SelectSet.addChange(new ChannelAndAttachment(channel,destination))

SelectSet.doSelect->SelectSet.createEndpoint->SelectChannelEndpoint.schedule->..dispatch()->manager.dispatch(SelectChannelEndpoint._handler) //endpoint._handler感覺像是短暫性任務

 

 

3.2 發送請求

HttpClient.send->HttpDestination.send->AsyncHttpConnection.send[AbstractHttpConnection.send,AsyncEndpoint.asyncDispatch]  //AbstractHttpConnection.send將exchange設置到connection中

 

AsyncEndpoint.asyncDispatch->SelectChannelEndPoint.dispatch->manager.dispatch(SelectChannelEndPoint.handler)->SelectChannelEndPoint.handler->AsyncConnection.handle()

3.3 響應處理

 

4. server:

 

分析入門類:

org.eclipse.jetty.embedded.OneHandler

1. 關鍵對象關係   

 

 

Server,

ServerConnector,

SelectorManager

 

2. 關鍵堆棧

 

"qtp985922955-15-lowPrioritySelector@768" prio=1 tid=0xf nid=NA runnable
  java.lang.Thread.State: RUNNABLE
blocks qtp985922955-26@1393
  at sun.nio.ch.KQueueArrayWrapper.kevent0(KQueueArrayWrapper.java:-1)
  at sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:198)
  at sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:117)
  at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
  - locked <0x653> (a sun.nio.ch.KQueueSelectorImpl)
  - locked <0x654> (a java.util.Collections$UnmodifiableSet)
  - locked <0x655> (a sun.nio.ch.Util$2)
  at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
  at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
  at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.select(ManagedSelector.java:302)
  at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.produce(ManagedSelector.java:254)
  - locked <0x64d> (a org.eclipse.jetty.io.ManagedSelector$SelectorProducer)
  at org.eclipse.jetty.util.thread.strategy.ProduceExecuteConsume.produce(ProduceExecuteConsume.java:75)
  at org.eclipse.jetty.io.ManagedSelector.lowPriorityProduce(ManagedSelector.java:113)
  at org.eclipse.jetty.io.ManagedSelector$$Lambda$2.2025864991.run(Unknown Source:-1)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
  at java.lang.Thread.run(Thread.java:745)


"qtp985922955-17@770" prio=5 tid=0x11 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
blocks qtp985922955-14-lowPrioritySelector@767
  at sun.nio.ch.KQueueArrayWrapper.kevent0(KQueueArrayWrapper.java:-1)
  at sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:198)
  at sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:117)
  at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
  - locked <0x64e> (a sun.nio.ch.KQueueSelectorImpl)
  - locked <0x64f> (a java.util.Collections$UnmodifiableSet)
  - locked <0x650> (a sun.nio.ch.Util$2)
  at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
  at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
  at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.select(ManagedSelector.java:302)
  at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.produce(ManagedSelector.java:254)
  - locked <0x651> (a org.eclipse.jetty.io.ManagedSelector$SelectorProducer)
  at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:147)
  at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:133)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
  at java.lang.Thread.run(Thread.java:745)


"qtp985922955-23@1079" prio=5 tid=0x17 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
  at org.eclipse.jetty.embedded.HelloHandler.handle(HelloHandler.java:59)
  at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
  at org.eclipse.jetty.server.Server.handle(Server.java:564)
  at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:320)
  at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
  at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
  at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:112)
  at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
  at java.lang.Thread.run(Thread.java:745)


"Scheduler-1811044090@1115" prio=5 tid=0x18 nid=NA waiting
  java.lang.Thread.State: WAITING
  at sun.misc.Unsafe.park(Unsafe.java:-1)
  at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
  at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
  at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
  at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  at java.lang.Thread.run(Thread.java:745)


"qtp985922955-16-acceptor-0@4135737-ServerConnector@ad4a9c5{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}@769" prio=3 tid=0x10 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
  at sun.nio.ch.ServerSocketChannelImpl.accept0(ServerSocketChannelImpl.java:-1)
  at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
  at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
  - locked <0x652> (a java.lang.Object)
  at org.eclipse.jetty.server.ServerConnector.accept(ServerConnector.java:354)
  at org.eclipse.jetty.server.AbstractConnector$Acceptor.run(AbstractConnector.java:603)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
  at java.lang.Thread.run(Thread.java:745)


"qtp985922955-27@1395" prio=5 tid=0x1b nid=NA waiting
  java.lang.Thread.State: WAITING
  at sun.misc.Unsafe.park(Unsafe.java:-1)
  at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
  at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:392)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:564)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.access$800(QueuedThreadPool.java:49)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:627)
  at java.lang.Thread.run(Thread.java:745)


"qtp985922955-25@1391" prio=5 tid=0x19 nid=NA waiting
  java.lang.Thread.State: WAITING
  at sun.misc.Unsafe.park(Unsafe.java:-1)
  at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
  at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:392)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:564)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.access$800(QueuedThreadPool.java:49)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:627)
  at java.lang.Thread.run(Thread.java:745)


"qtp985922955-21@1077" prio=5 tid=0x15 nid=NA waiting
  java.lang.Thread.State: WAITING
  at sun.misc.Unsafe.park(Unsafe.java:-1)
  at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
  at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:392)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:564)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.access$800(QueuedThreadPool.java:49)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:627)
  at java.lang.Thread.run(Thread.java:745)


"qtp985922955-20@1076" prio=5 tid=0x14 nid=NA waiting
  java.lang.Thread.State: WAITING
  at sun.misc.Unsafe.park(Unsafe.java:-1)
  at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
  at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:392)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:564)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.access$800(QueuedThreadPool.java:49)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:627)
  at java.lang.Thread.run(Thread.java:745)


"qtp985922955-14-lowPrioritySelector@767" prio=1 tid=0xe nid=NA waiting for monitor entry
  java.lang.Thread.State: BLOCKED
waiting for qtp985922955-17@770 to release lock on <0x651> (a org.eclipse.jetty.io.ManagedSelector$SelectorProducer)
  at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.produce(ManagedSelector.java:244)
  at org.eclipse.jetty.util.thread.strategy.ProduceExecuteConsume.produce(ProduceExecuteConsume.java:75)
  at org.eclipse.jetty.io.ManagedSelector.lowPriorityProduce(ManagedSelector.java:113)
  at org.eclipse.jetty.io.ManagedSelector$$Lambda$2.2025864991.run(Unknown Source:-1)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
  at java.lang.Thread.run(Thread.java:745)


"qtp985922955-12@756" prio=5 tid=0xc nid=NA waiting
  java.lang.Thread.State: WAITING
  at sun.misc.Unsafe.park(Unsafe.java:-1)
  at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
  at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:392)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:564)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.access$800(QueuedThreadPool.java:49)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:627)
  at java.lang.Thread.run(Thread.java:745)


"qtp985922955-26@1393" prio=5 tid=0x1a nid=NA waiting for monitor entry
  java.lang.Thread.State: BLOCKED
waiting for qtp985922955-15-lowPrioritySelector@768 to release lock on <0x64d> (a org.eclipse.jetty.io.ManagedSelector$SelectorProducer)
  at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.produce(ManagedSelector.java:244)
  at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:147)
  at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:133)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
  at java.lang.Thread.run(Thread.java:745)


"main@1" prio=5 tid=0x1 nid=NA waiting
  java.lang.Thread.State: WAITING
  at java.lang.Object.wait(Object.java:-1)
  at java.lang.Object.wait(Object.java:502)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.join(QueuedThreadPool.java:403)
  at org.eclipse.jetty.server.Server.join(Server.java:617)
  at org.eclipse.jetty.embedded.OneHandler.main(OneHandler.java:32)


"Finalizer@1323" daemon prio=8 tid=0x3 nid=NA waiting
  java.lang.Thread.State: WAITING
  at java.lang.Object.wait(Object.java:-1)
  at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
  at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
  at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)


"Reference Handler@1324" daemon prio=10 tid=0x2 nid=NA waiting
  java.lang.Thread.State: WAITING
  at java.lang.Object.wait(Object.java:-1)
  at java.lang.Object.wait(Object.java:502)
  at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
  at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)


"Signal Dispatcher@1322" daemon prio=9 tid=0x4 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
 3.官方架構說明

https://www.eclipse.org/jetty/documentation/9.4.7.v20170914/architecture.html
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章