2017-08-25 23 views
1

我正在嘗試構建一個REST Web服務器,其中GET請求是非阻塞的,即使它需要進行一個稍微耗時的調用。爲什麼在我的應用程序中連續執行Spring DeferredResult?

@RestController 
public class Endpoint { 
    static int callCount = 0; 

    @RequestMapping (value = "/endpoints", method = RequestMethod.GET) 
    public DeferredResult<Integer> someGetMethod() { 
     System.out.println("Mita: GET Called. Count#: " + callCount++); 
     DeferredResult<Integer> deferredResult = new DeferredResult<>(); 
     new Thread(() -> { 
      deferredResult.setResult(getSomething()); 
     }).start(); 
     System.out.println("Mita: Thread started"); 
     return deferredResult; 
    } 

    private int getSomething() { 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return 100; 
    } 
} 

爲了測試,我發送了兩個GET請求,從Restlet到同一端點,間隔約2秒。但是,我在我的spring應用程序的DEBUG級日誌中看到以下內容。

2017-08-26 01:16:38.231 DEBUG 1252 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer  : Received [GET /endpoints/ HTTP/1.1 
Host: localhost:8080 
Connection: keep-alive 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36 
Accept: */* 
DNT: 1 
Accept-Encoding: gzip, deflate, br 
Accept-Language: en-US,en;q=0.8,es;q=0.6,zh-CN;q=0.4,zh;q=0.2 
] 
... 
... 
2017-08-26 01:16:43.399 DEBUG 1252 --- [nio-8080-exec-2] o.a.coyote.http11.Http11InputBuffer  : Received [GET /endpoints/ HTTP/1.1 
Host: localhost:8080 
Connection: keep-alive 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36 
Accept: */* 
DNT: 1 
Accept-Encoding: gzip, deflate, br 
Accept-Language: en-US,en;q=0.8,es;q=0.6,zh-CN;q=0.4,zh;q=0.2 

] 

注意,兩個請求是怎麼來之後5秒,精確的時間間隔我稱睡眠(即使我後,第一個發送的請求〜2秒)。所以,看起來tomcat正在順序化傳入的請求。我如何讓tomcat不要序列化請求?或者是我錯過了一些非常明顯的東西。

回答

1

DeferredResult使用(它使用或者Servlet非同步模式)不會阻止客戶端(在這種情況下的Restlet)不等待5秒鐘它得到從所述第一請求響應之前。

對於調用您的Spring端點的客戶端而言,看起來就像Spring端點根本不使用異步模式一樣。這意味着Restlet或Tomcat可能會等到第一個請求完成後再向您的端點提供第二個請求。

+0

你說得對。看起來Restlet是這裏的罪魁禍首。我使用JMeter測試了我的服務器,我可以看到大約100個併發呼叫在5000到5010毫秒之間返回。感謝您指出了這一點。 – Moni

相關問題