歡迎光臨
每天分享高質量文章

Spring Boot:調優Tomcat

透過在application.properties設定對應的key-value對,可以配置Spring Boot應用程式的很多特性,例如POST、SSL、MySQL等等。如果需要更加複雜的調優,則可以利用Spring Boot提供的EmbeddedServletContainerCustomizer介面透過程式設計方式和修改配置資訊。

儘管可以透過application.properties設定server.session-timeout屬性來配置伺服器的會話超時時間,這裡我們用EmbeddedServletContainerCustomizer介面修改,來說明該介面的用法。

How Do

  • 假設我們希望設定會話的超時時間為1分鐘。在WebConfiguration類中增加EmbeddedServletContainerCustomizer型別的spring bean,程式碼如下:

  1. @Bean

  2. public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {

  3.    return new EmbeddedServletContainerCustomizer() {

  4.        @Override

  5.        public void customize(ConfigurableEmbeddedServletContainer container) {

  6.            container.setSessionTimeout(1, TimeUnit.MINUTES);

  7.        }

  8.    };

  9. }

  • 在BookController中新增一個getSessionId(HttpServletRequest request)函式,直接傳回request.getSession().getId()。

  1. @RequestMapping(value = "/session", method = RequestMethod.GET)

  2. public String getSessionId(HttpServletRequest request) {

  3.    return request.getSession().getId();

  4. }

  • 透過 mvn spring-boot:run啟動應用

  • 透過postman訪問 http://localhost:8080/books/session,得到的結果如下

1分鐘以後再次呼叫這個介面,則發現傳回的session id已經改變。

分析

除了可以使用上面這個寫法,對於使用Java 8的開發人員,還可以使用lambda運算式處理,就不需要建立一個EmbeddedServletContainerCustomizer實體了。程式碼如下:

  1. //對於Java 8來說可以用lambda運算式,而不需要建立該介面的一個實體.

  2. @Bean

  3. public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {

  4.    return (ConfigurableEmbeddedServletContainer container) -> {

  5.        container.setSessionTimeout(1, TimeUnit.MINUTES);

  6.    };

  7. }

在程式啟動階段,Spring Boot檢測到custoimer實體的存在,然後就會呼叫invoke(…)方法,並向內傳遞一個servlet物件的實體。在我們這個例子中,實際上傳入的是TomcatEmbeddedServletContainerFactory容器物件,但是如果使用Jutty或者Undertow容器,就會用對應的容器物件。

贊(0)

分享創造快樂