2017-10-08 70 views
4

使用Netbeans並編寫任意REST端點時,NetBeans始終顯示警告,表明該方法可以轉換爲異步。Java EE中應該每個REST端點都是異步的嗎?

例如,我創建以下方法:

@GET 
@Path("/test") 
public String hello() { 
    return "Hello World!"; 
} 

的NetBeans然後顯示一個警告,見下文:

Convert to asynchronous

點擊工具提示生成此代碼:

private final ExecutorService executorService = java.util.concurrent.Executors.newCachedThreadPool(); 

@GET 
@Path(value = "/test") 
public void hello(@Suspended final AsyncResponse asyncResponse) { 
    executorService.submit(new Runnable() { 
     @Override 
     public void run() { 
      asyncResponse.resume(doHello()); 
     } 
    }); 
} 

private String doHello() { 
    return "Hello World!"; 
} 

創建PUT時同樣如此或POST方法。由於在實現REST端點時NetBeans總是顯示警告,這告訴我編寫同步端點被認爲是錯誤/不正確的做法。那麼,每個REST端點應該是異步的嗎?爲什麼?

+0

會發生什麼,如果兩個用戶請求同時訪問相同的資源? –

+0

據我所知,服務器的線程池中有多個線程可用。每當有新的請求進入時,服務器都會將其中一個線程分配給該請求,並在處理完請求(不管訪問哪個資源)後將線程釋放到池中。這也意味着默認情況下JAX-RS是線程安全的。 – Jakob

+0

什麼是您的netbeans版本? – user7294900

回答

1

默認情況下,在服務器上請求的處理在同步 模式下工作,這意味着每個請求在單個HTTP 線程處理。當請求處理完成後,線程返回到線程池 。當資源方法 執行時間短並且併發連接數 相對不是很高時,這不是很重要。在異步模式下,在請求處理完成之前,線程返回到線程池 。 然後在另一個線程中繼續請求處理,稱爲 Worker。釋放的I/O線程可用於接受新的傳入請求。在很多情況下,只有幾個線程可以同時處理大量的請求,因此處理傳入請求所需的線程數量可以顯着減少。通過使用少了很多 線程,我們都節省內存,提高性能(通過減少 線程上下文切換)

這可能會清除你的困惑一點bit.Have看看這個link

+0

感謝您的回覆,但我仍然完全不理解它。如果我只是將工作負載從HTTP線程中繼到工作線程,那麼如果所有工作線程都忙碌,這仍不會提高性能。只要我不等待其他資源(DB,API),工作線程就應該忙於請求完成。由於I/O線程的原因,我只能接受更多的請求,但如果這些請求無法完成,那不會對我有所幫助 – Jakob

相關問題