Kafka server的的停止

devos發表於2014-05-18

這算是CountDownLatch的一個典型使用場景。

kafka.Kafka物件的main方法中與此有關的程式碼為

      // attach shutdown handler to catch control-c
      Runtime.getRuntime().addShutdownHook(new Thread() {
        override def run() = {
          kafkaServerStartble.shutdown
        }
      })

      kafkaServerStartble.startup
      kafkaServerStartble.awaitShutdown
      System.exit(0)

  首先,註冊一個shutdownHook,在control-c等令虛擬機器停止命令後,虛擬機器會啟動被註冊的hook對應的執行緒,在這裡,server的shutdown方法將被呼叫。

  然後,啟動server。在server的startup方法中,會初始化一個CountDownLatch為1。這時,server的各個子服務開始執行。

  然後,呼叫server的awaitShutdown方法,使得main執行緒阻塞。

  

  def awaitShutdown(): Unit = shutdownLatch.await()

  這個方法就是簡單地呼叫CountDownLatch的await方法。而之前提到的,server的shutdown方法就是在停止server的各個服務後,呼叫CountDownLatch的countDown方法,這時,阻塞在await的main執行緒就會醒來,從而呼叫System.exit。

 

  綜上,control-c 使shutDown在shutDownHook的執行緒中被呼叫,從而使CountDownLatch減1,使得之前阻塞在同一個CountDownLatch的main執行緒繼續,從而呼叫 System.exit推出JVM。

相關文章