記事ディレクトリ
1 RequestOptions: リクエストメソッド (同期/非同期)
1.1 問題の生成
ES アドバンスト クライアントを使用して ES サーバーにリクエストを送信し、同期リクエスト メソッドを使用してインデックス ライブラリを作成する場合、参照後に同期呼び出しメソッドを参照するコードがあり、もちろん
RequestOptions.DEFAULT
、非同期呼び出し。
1.2 問題分析
呼び出し方法 | 説明 |
---|---|
同期的に | ① IndexRequest を同期的に実行する場合、クライアントは返された結果 IndexResponse を待つ必要がある; ② IndexResponse を受信した後、クライアントはコードを実行し続けることができる |
非同期モード | ① IndexRequest を非同期で実行する場合、高度なクライアントはリクエスト結果の返信を同期的に待つ必要がなく、非同期インターフェイス実行の成功結果をインターフェイス呼び出しメソッドに直接返すことができます; ② 非同期で返された応答結果を処理するか、プロセスを処理します。リクエストの実行中に発生した処理情報, ユーザーはリスナー ActionListener を指定する必要があります. リクエストが正常に実行されると, ActionListener の onRespose() メソッドが呼び出され, メソッド内の対応するロジック処理が実行されます.リクエストの実行が失敗すると、対応するロジック処理のために ActionListener の onFailure() が呼び出されます |
1.2.1 同期方法
同期:
restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
1.2.1 非同期モード
非同期の方法:
estHighLevelClient.indexAsync(indexRequest, RequestOptions.DEFAULT, actionListener);
1.3 問題解決
1.3.1 非同期モードのコード
/**
* 向es服务器发送请求,创建索引,请求方式:异步
*/
@Test
public void testCreateIndex2(){
//目标:向es服务器发送请求,创建索引,请求方式:异步
//1.创建request对象
IndexRequest indexRequest = new IndexRequest("hetol");
indexRequest.source(Constants.MAPPING,XContentType.JSON);
//3.通过ES高级客户端向ES服务器通信
ActionListener<IndexResponse> listener = new ActionListener<IndexResponse>() {
@Override
public void onResponse(IndexResponse indexResponse) {
System.out.println("执行成功");
}
@Override
public void onFailure(Exception e) {
System.out.println("执行失败"+e.getMessage());
}
};
client.indexAsync(indexRequest,RequestOptions.DEFAULT,listener);
}
1.3.2 スローされる非同期モード コードの問題
このコードの実行中に、次の 2 つの問題が見つかりました。
① コード実行の最後に、ES 内のインデックス ライブラリが正常に作成されていることがわかりました。
② インデックス ライブラリが正常に作成されている一方で、次のことがわかりました。深刻な収穫: 実行成功. 成功後ロジックは onResponse( ) メソッドに入る. なぜだろう.结果却是走了onFailure( )失败的方法,报错说意外断开连接,难道这个方法就是如此吗(执行完断开连接,可是onResponse( )方法里的逻辑不是也就不能走了)?
1.3.2.1 問題分析のスロー
アイデア: ソース コードを見て、正在分析
何か洞察があれば、メッセージを残してコメント エリアで議論してください。