2016-08-19 2137 views
1

如果請求正在處理超過3秒鐘,我希望我的Spring Boot應用程序使用嵌入式Tomcat重置連接。但是我無法做到這一點。我的最後一個代碼片段是:如何配置Spring Boot嵌入式Tomcat連接超時?

@SpringBootApplication 
@ComponentScan(basePackages = {"."}) 
@Controller 
public class ExternalServerApplication { 
    public static void main(String[] args) { 
     SpringApplication.run(ExternalServerApplication.class, args); 
    } 

    @Bean 
    public EmbeddedServletContainerFactory servletContainerFactory() { 
     TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); 

     factory.addConnectorCustomizers(
       connector -> { 
        AbstractProtocol protocol = (AbstractProtocol) connector.getProtocolHandler(); 
        protocol.setConnectionTimeout(1); 
        protocol.setKeepAliveTimeout(1); 
        protocol.setSoTimeout(1); 
        protocol.setPort(8012); 
        protocol.setMaxThreads(10); 
       }); 

     return factory; 
    } 

    @RequestMapping("/request") 
    @ResponseBody 
    public String request() throws InterruptedException { 
     for (int i = 0; i < 50; i++) { 
      Thread.sleep(100); 
     } 
     return "OK"; 
    } 
} 

但它也不起作用。

localhost:8012/requests的請求持續5秒鐘並返回「OK」,但它應該被重置。

任何想法?

+0

您是否試過在application.properties中指定server.connection-timeout = 3000? 編輯:另一方面,你寫處理請求超時,而在我看來server.connection超時是別的東西(從文檔引述:「這個連接器接受連接後,等待的毫秒數要顯示的URI行。「) – patrykos91

+0

查看該線程:http:// stackoverflow。com/questions/7145131/tomcat-request-timeout 另一個可以解決你的問題的方法是用Netflix Zuul :) – patrykos91

回答

0

你在找什麼是客戶端超時。您已設置的參數 - setConnectionTimeout,set保持運行時間,setSoTimeout - 具有不同的含義。

作爲每的Apache Tomcat文檔,下面是這些超時的定義:

ConnectionTimeout - 毫秒數則此連接器 等待,接受連接,用於請求URI行之後要 呈現

的KeepAliveTimeout - 毫秒數此連接器將等待 爲ANOT關閉連接

soTimeout之前她HTTP請求 - 這相當於標準屬性connectionTimeout

這些都不匹配您的要求,這就是:

  1. 考慮結束處理請求所花費的時間
  2. 如果該時間超出預設值(3秒,在您的情況下)

這樣的功能需要成爲http客戶端實現的一部分,並且特定於您正在使用的http客戶端。

假設例如,如果您使用curl發出http請求,則可以使用curl的--max-time選項來指定此選項,如下所示。

curl --max-time 3 http://localhost:8012/requests 
+0

對不起,但是我無法控制客戶端的行爲 – corvax

相關問題