第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Elasticsearch Java High-Level REST Client 建立一堆 TCP

Elasticsearch Java High-Level REST Client 建立一堆 TCP

RISEBY 2022-06-23 17:24:15
我有一個每秒運(yùn)行一次的定期作業(yè)(這是可配置的)。在這項(xiàng)工作中,我首先創(chuàng)建一個到 Elasticsearch 服務(wù)器的連接:RestHighLevelClient client = new RestHighLevelClient(                    RestClient.builder(new HttpHost(address, port, "http")));然后我檢查是否存在一個名為test. 如果它不存在,我先創(chuàng)建它。GetIndexRequest indexRequest = new GetIndexRequest();indexRequest.indices("test");boolean testIndexIsExists = false;try {                testIndexIsExists = client.indices().exists(indexRequest, RequestOptions.DEFAULT);     } catch (IOException ioe) {    logger.error("Can't check the existence of test index in Elasticsearch!");  }if(testIndexIsExists) {     // bulk request...} else {    CreateIndexRequest testIndex = new CreateIndexRequest("test");    try {           testIndex.mapping("doc", mappingConfiguration);        client.indices().create(testIndex, RequestOptions.DEFAULT);        // bulk request...      } catch (IOException ioe) {         logger.error("Can't create test index in Elasticsearch");    }   }在執(zhí)行了一個包含近 2000 個文檔的批量請求后,我關(guān)閉了 Elasticsearch 客戶端連接:client.close();Java 高級 REST 客戶端版本:<dependency>    <groupId>org.elasticsearch.client</groupId>    <artifactId>elasticsearch-rest-high-level-client</artifactId>    <version>6.4.0</version></dependency>我的問題是一堆 TCP 連接已經(jīng)建立并且沒有關(guān)閉。這些 TCP 連接隨著時間的推移占用所有操作系統(tǒng) TCP 連接。另一方面,我有點(diǎn)困惑。實(shí)例應(yīng)該RestHighLevelClient是整個應(yīng)用程序的單例對象,還是我必須在每個作業(yè)運(yùn)行周期中創(chuàng)建一個新實(shí)例并在完成該作業(yè)后關(guān)閉該實(shí)例?
查看完整描述

2 回答

?
達(dá)令說

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個贊

高級客戶端已經(jīng)為您維護(hù)了一個連接池,所以我會將它用作單例。不斷創(chuàng)建和關(guān)閉連接池的成本很高,而且客戶端和底層 HTTP 連接池都是線程安全的。此外,對客戶端的調(diào)用close()只是委托給 Apache HTTP 客戶端shutdown()方法,因此您將受制于它們?nèi)绾翁幚砬謇砗歪尫刨Y源。


如果您使用 Spring 或其他一些 DI 框架,則可以輕松創(chuàng)建可以根據(jù)需要注入的客戶端單例實(shí)例。您可以將調(diào)用添加client.close()為 bean 關(guān)閉/銷毀生命周期階段的一部分。


使用 Spring Boot 的快速示例:


@Configuration

@ConditionalOnClass(RestHighLevelClient.class)

public class ElasticSearchConfiguration {


    @Value("${elasticsearch.address}")

    String address;


    @Value("${elasticsearch.port}")

    int port;


    @Bean(destroyMethod = "close")

    public RestHighLevelClient restHighLevelClient() {

        return new RestHighLevelClient(

                RestClient.builder(new HttpHost(address, port, "http")));

    }

}

注意:在這種情況下,Spring 會自動檢測 bean 有一個close方法,并在 bean 被銷毀時為您調(diào)用它。其他框架可能要求您指定應(yīng)如何處理關(guān)閉。


查看完整回答
反對 回復(fù) 2022-06-23
?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個贊

RestHighLevelClient通常應(yīng)該是單例的,除非你有充分的理由。例如,如果您的作業(yè)每小時而不是一分鐘運(yùn)行,那么創(chuàng)建新實(shí)例并在作業(yè)后關(guān)閉它可能是有意義的。

如果您確定close()在所有情況下都在調(diào)用(例如,您沒有錯過任何異常),那么我的下一個猜測是彈性客戶端中的錯誤。

看起來他們忘記在 exists 調(diào)用中使用響應(yīng): https ://github.com/elastic/elasticsearch/blob/v6.4.0/client/rest-high-level/src/main/java/org/elasticsearch /client/RestHighLevelClient.java#L1419

你能在沒有exists電話的情況下進(jìn)行測試嗎?


查看完整回答
反對 回復(fù) 2022-06-23
  • 2 回答
  • 0 關(guān)注
  • 387 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號