class KafkaRequestHandler(id: Int, brokerId: Int, val aggregateIdleMeter: Meter,
val totalHandlerThreads: Int, val requestChannel: RequestChannel,
apis: KafkaApis) extends Runnable with Logging {
def run() {
while(true) {
try {
var req : RequestChannel.Request = null
while (req == null) {
val startSelectTime = SystemTime.nanoseconds
// 從requestChannel.requestQueue隊列里獲取請求
req = requestChannel.receiveRequest(300)
val idleTime = SystemTime.nanoseconds - startSelectTime
aggregateIdleMeter.mark(idleTime / totalHandlerThreads)
}
apis.handle(req)
} catch {
case e: Throwable => error("Exception when handling request", e)
}
}
}
}
// 在KafkaServer啟動會創建KafkaRequestHandlerPool
class KafkaRequestHandlerPool(val brokerId: Int, val requestChannel: RequestChannel,
val apis: KafkaApis,
numThreads: Int) extends Logging with KafkaMetricsGroup {
// 線程池里的線程個數
val threads = new Array[Thread](numThreads)
// KafkaRequestHandler集合
val runnables = new Array[KafkaRequestHandler](numThreads)
// 創建并啟動KafkaRequestHandler線程
for(i <- 0 until numThreads) {
runnables(i) = new KafkaRequestHandler(i, brokerId, aggregateIdleMeter, numThreads, requestChannel, apis)
threads(i) = Utils.daemonThread("kafka-request-handler-" + i, runnables(i))
threads(i).start()
}
}
class KafkaApis(val requestChannel: RequestChannel, val replicaManager: ReplicaManager,
val coordinator: GroupCoordinator, val controller: KafkaController, val zkUtils: ZkUtils,
val brokerId: Int, val config: KafkaConfig, val metadataCache: MetadataCache,
val metrics: Metrics, val authorizer: Option[Authorizer]) extends Logging {
def handle(request: RequestChannel.Request) {
try {
// 根據requestId分發請求
ApiKeys.forId(request.requestId) match {
case ApiKeys.PRODUCE => handleProducerRequest(request)
case ApiKeys.FETCH => handleFetchRequest(request)
case ApiKeys.LIST_OFFSETS => handleOffsetRequest(request)
case ApiKeys.METADATA => handleTopicMetadataRequest(request)
case ApiKeys.LEADER_AND_ISR => handleLeaderAndIsrRequest(request)
case ApiKeys.STOP_REPLICA => handleStopReplicaRequest(request)
case ApiKeys.UPDATE_METADATA_KEY => handleUpdateMetadataRequest(request)
case ApiKeys.CONTROLLED_SHUTDOWN_KEY => handleControlledShutdownRequest(request)
case ApiKeys.OFFSET_COMMIT => handleOffsetCommitRequest(request)
case ApiKeys.OFFSET_FETCH => handleOffsetFetchRequest(request)
case ApiKeys.GROUP_COORDINATOR => handleGroupCoordinatorRequest(request)
case ApiKeys.JOIN_GROUP => handleJoinGroupRequest(request)
case ApiKeys.HEARTBEAT => handleHeartbeatRequest(request)
case ApiKeys.LEAVE_GROUP => handleLeaveGroupRequest(request)
case ApiKeys.SYNC_GROUP => handleSyncGroupRequest(request)
case ApiKeys.DESCRIBE_GROUPS => handleDescribeGroupRequest(request)
case ApiKeys.LIST_GROUPS => handleListGroupsRequest(request)
case ApiKeys.SASL_HANDSHAKE => handleSaslHandshakeRequest(request)
case ApiKeys.API_VERSIONS => handleApiVersionsRequest(request)
case requestId => throw new KafkaException("Unknown api code " + requestId)
}
} catch {
} finally
request.apiLocalCompleteTimeMs = SystemTime.milliseconds
}
}
KafkaRequestHandler.scala
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- 在創建scala項目的時候create Scala SDK: 這里選擇bin上一級目錄,然后點擊OK 這樣就出現了...
- 多維數組:數組的元素,還是數組,數組套數組,就是多維數組 構造指定行與列的二維數組:Array.ofDim方法 構...
- http://www.cnblogs.com/cbscan/articles/4147709.html
- Scala 篇 單例對象 在 Java 中實現單例對象通常需要自己實現一個類并創建 getInstance() 的...
- intellij idea安裝scala插件后卻沒有new->Scala class選項,在file->proje...