本文介紹了Jersey客戶端非阻塞的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
派生大量線程從來都不是一個好主意(當您創(chuàng)建太多線程時,無論如何都可能會耗盡內存)。
通常,Jersey需要為每個請求創(chuàng)建一個線程。無論我使用async()
(Jersey為我創(chuàng)建線程-我已經在調試器中研究過這一點),還是不使用(顯然我必須自己創(chuàng)建線程),情況似乎都是如此。
所以這里有一個具體的情況,這是不夠好的:
我正在以高達500個請求/秒的速度向遠程服務器發(fā)送HTTP。但是,由于響應可能需要一些時間才能到達(我計算最多30秒),線程總數(shù)很容易達到數(shù)千(此時,JVM進程通常會崩潰)。此外,創(chuàng)建這么多線程簡直是瘋了。對于處理該負載的可用處理器/網絡/操作系統(tǒng)資源來說,這實際上應該是小菜一碟。
因此,我想要做的就是發(fā)出請求,并在HTTP響應到達時得到操作系統(tǒng)的通知。
如上所述,簡單地使用target.request(...).async()....
并不能達到目的(因為這樣一來,Jersey只會產生自己的線程)。
此外,通過new ClientConfig().property(ClientProperties.ASYNC_THREADPOOL_SIZE, 10)
限制線程數(shù)也沒有任何幫助,因為這意味著一次最多只能發(fā)送10個請求,這顯然不是我想要的(這只會堆積隊列)。
我嘗試了new ClientConfig().connectorProvider(new GrizzlyConnectorProvider())
以獲得NIO支持-但在行為上根本看不到任何差異。
那么,有什么方法可以在不為每個請求創(chuàng)建一個額外線程的情況下啟動請求嗎?
推薦答案
我正在使用CloseableHttpAsyncClient向外部服務發(fā)出異步請求。它在每秒幾百個請求的情況下工作得很好,我還沒有觀察到像您這樣的線程數(shù)量。它是一個外部依賴項,您可以通過
通過Maven進行集成
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.0.1</version>
</dependency>
希望這能有所幫助。
這篇關于Jersey客戶端非阻塞的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,