Elasticsearch Java Low Level REST Client(執行請求)

博弈發表於2019-01-19

執行請求

一旦建立了RestClient,就可以通過呼叫performRequestperformRequestAsync來傳送請求,performRequest是同步的,將阻塞呼叫執行緒並在請求成功時返回Response,如果失敗則丟擲異常。performRequestAsync是非同步的,它接受一個ResponseListener引數,它在請求成功時呼叫Response,如果失敗則呼叫Exception

這是同步的:

Request request = new Request(
    "GET",  
    "/");   
Response response = restClient.performRequest(request);
  • 第一個引數:HTTP方法(GETPOSTHEAD等)。
  • 第二個引數:伺服器上的端點。

這是非同步的:

Request request = new Request(
    "GET",  
    "/");   
restClient.performRequestAsync(request, new ResponseListener() {
    @Override
    public void onSuccess(Response response) {
        
    }

    @Override
    public void onFailure(Exception exception) {
        
    }
});
  • onSuccess方法:處理響應。
  • onFailure:處理失敗。

你可以將請求引數新增到請求物件:

request.addParameter("pretty", "true");

你可以將請求的body設定為任何HttpEntity

request.setEntity(new NStringEntity(
        "{"json":"text"}",
        ContentType.APPLICATION_JSON));

HttpEntity指定的ContentType很重要,因為它將用於設定Content-Type header,以便Elasticsearch可以正確解析內容。

你還可以將其設定為String,預設為ContentTypeapplication/json

request.setJsonEntity("{"json":"text"}");

RequestOptions

RequestOptions類儲存應在同一應用程式中的多個請求之間共享的部分請求,你可以建立單例例項並在所有請求之間共享它:

private static final RequestOptions COMMON_OPTIONS;
static {
    RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
    builder.addHeader("Authorization", "Bearer " + TOKEN); 
    builder.setHttpAsyncResponseConsumerFactory(           
        new HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
    COMMON_OPTIONS = builder.build();
}
  • builder.addHeader:新增所有請求所需的任何header。
  • builder.setHttpAsyncResponseConsumerFactory:自定義響應消費者。

addHeader用於授權或在Elasticsearch前使用代理所需的header,無需設定Content-Type header,因為客戶端將自動從附加到請求的HttpEntity設定該header。

你可以設定NodeSelector來控制哪些節點將接收請求。

NodeSelector.NOT_MASTER_ONLY是一個不錯的選擇。

你還可以自定義用於緩衝非同步響應的響應消費者,預設消費者將在JVM堆上緩衝最多100MB的響應,如果響應較大,則請求將失敗。例如,如果你在堆約束環境(如上面的例子)中執行,則可以降低可能有用的最大大小。

建立單例後,你可以在發出請求時使用它:

request.setOptions(COMMON_OPTIONS);

你還可以根據請求自定義這些選項,例如,這會新增額外的header:

RequestOptions.Builder options = COMMON_OPTIONS.toBuilder();
options.addHeader("cats", "knock things off of other things");
request.setOptions(options);

多個並行非同步操作

客戶端很樂意並行執行許多操作,以下示例並行索引許多文件,在現實世界的場景中,你可能希望使用_bulk API,但示例是作例證的。

final CountDownLatch latch = new CountDownLatch(documents.length);
for (int i = 0; i < documents.length; i++) {
    Request request = new Request("PUT", "/posts/doc/" + i);
    //let`s assume that the documents are stored in an HttpEntity array
    request.setEntity(documents[i]);
    restClient.performRequestAsync(
            request,
            new ResponseListener() {
                @Override
                public void onSuccess(Response response) {
                    
                    latch.countDown();
                }

                @Override
                public void onFailure(Exception exception) {
                    
                    latch.countDown();
                }
            }
    );
}
latch.await();
  • onSuccess:處理返回的響應。
  • onFailure:由於通訊錯誤或帶有指示錯誤的狀態碼的響應,處理返回的異常。

上一篇:初始化

下一篇:讀取響應

相關文章