2017-08-15 73 views
4

這是一個後續問題How to shutdown a Spring Boot Application in a correct way? 使用Spring Boot執行器安全關閉其他服務器?

假設我們有一個服務器有3個客戶端當前連接,並且每個客戶端運行一個長時間的工作。然後,我們用關機命令的服務器:

curl -X POST localhost:port/shutdown 

這是否:

A)讓系統完成了3個客戶端關閉之前運行的作業?

B)禁止發生其他任何連接,以至於服務器最終會關閉?

回答

4

Spring Boot shutdown端點調用此類:org.springframework.boot.actuate.endpoint.ShutdownEndpoint,它在ApplicationContext上調用close()。這反過來...

  • 破壞豆
  • 關閉bean工廠
  • 停止嵌入式servlet容器

如果豆類是有序的,並已精心編寫的關閉方法那麼這應該是精細。但是,如果沒有,那麼在該關機週期的某個時刻,「3個客戶正在運行的作業」可能會被中斷。此外,它是可能的新的連接可能會在你調用關機和停機循環踢。

Spring提供了應用程序事件和事件監聽鉤子,讓你參加關機週期之間的小時間窗口中進行。該ContextClosedEvent發表以前豆被破壞,嵌入式集裝箱關機等,所以你可以使用這個默認的行爲踢之前實現自己的關閉行爲,例如:

public class ShutdownListener implements ApplicationListener<ContextClosedEvent> { 
    @Override 
    public void onApplicationEvent(ContextClosedEvent event) { 
     // 
    } 
} 

您可以實現這個監聽器使得它

  • 暫停(如果你不與HTTP請求處理或東西相當於),以允許任何進行中的工作完成後再繼續
  • 不合格品的連接請求用HTTP 503與關機週期

您註冊此偵聽器的方式與您在Spring Boot中註冊任何ApplicationListener的方式相同,例如:

SpringApplicatiom app = new SpringApplication(MyApplication.class); 
app.addListeners(new ShutdownListener()); 
+0

「破豆」是什麼意思? –

+1

@JoseMartinez這意味着關閉它們或丟棄它們。使用術語「銷燬」是因爲Spring允許你定義一個'destroy-method',它將保證在應用程序上下文關閉時代表你調用。 – glytching

+0

如何以編程方式拒絕所有連接? –