@Scope
@Slf4j
@Component
public class ESBulkProcessorConfig {
@Value("${spring.elasticsearch.rest.uris}")
private String hostlist;
@Bean
public RestHighLevelClient restHighLevelClient() {
//解析hostlist配置信息
String[] split = hostlist.split(",");
//创建HttpHost数组,其中存放es主机和端口的配置信息
HttpHost[] httpHostArray = new HttpHost[split.length];
for(int i=0;i<split.length;i++){
String item = split[i];
System.out.println(item);
httpHostArray[i] = new HttpHost(item.split(":")[0],
Integer.parseInt(item.split(":")[1]), "http");
}
// 构建连接对象
RestClientBuilder builder = RestClient.builder(httpHost);
// 异步连接延时配置
builder.setRequestConfigCallback(requestConfigBuilder -> {
requestConfigBuilder.setConnectTimeout(2000);
requestConfigBuilder.setSocketTimeout(30000);
requestConfigBuilder.setConnectionRequestTimeout(1000);
return requestConfigBuilder;
});
// 异步连接数配置
builder.setHttpClientConfigCallback(httpClientBuilder -> {
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
String esUser = esConfig.getUsername();
String esPwd = esConfig.getPassword();
if (StrUtil.isAllNotBlank(esUser, esPwd)) {
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(esUser, esPwd));
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
httpClientBuilder.setMaxConnTotal(200);
httpClientBuilder.setMaxConnPerRoute(1000);
return httpClientBuilder;
});
//创建RestHighLevelClient客户端
return new RestHighLevelClient(builder);
}
@Bean
public BulkProcessor bulkProcessor() {
RestHighLevelClient client = restHighLevelClient();
BiConsumer<BulkRequest, ActionListener<BulkResponse>> bulkConsumer =
(request, bulkListener) -> client.bulkAsync(request, RequestOptions.DEFAULT, bulkListener);
return BulkProcessor.builder(bulkConsumer, new BulkProcessor.Listener() {
@Override
public void beforeBulk(long l, BulkRequest bulkRequest) {
// to do something....
int i = request.numberOfActions();
log.error("ES 同步数量{}",i);
}
@Override
public void afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) {
log.info("bulk fail: {}", bulkResponse.buildFailureMessage());
if (bulkResponse.hasFailures()) {
// to do something....
}else {
// to do something....
}
}
@Override
public void afterBulk(long l, BulkRequest bulkRequest, Throwable throwable) {
// to do something....
log.error("写入ES 重新消费");
}
}).setBulkActions(1000)
.setBulkSize(new ByteSizeValue(2, ByteSizeUnit.MB))
.setFlushInterval(TimeValue.timeValueSeconds(5))
.setConcurrentRequests(8)
.setBackoffPolicy(BackoffPolicy.exponentialBackoff(TimeValue.timeValueMinutes(5), 0))
.build();
}
}
批量插入操作
@Resource
private BulkProcessor bulkProcessor;
... ...(){
// 批量插入ES
for(Entity entity : entityList){
bulkProcessor.add(new IndexRequest("你的索引").source(JSONUtil.toJsonStr(entity), XContentType.JSON));
}
}
BulkProcessor类详细参考: link