public void handle(String indexName, List<Long> idList) {
if (CollectionUtils.isEmpty(idList)) {
log.error("id列表为空,此次删除es数据操作,结束");
return;
}
BulkProcessor bulkProcessor = null;
try {
idList = idList.stream().filter(Objects::nonNull).collect(Collectors.toList());
bulkProcessor = esCommonUtils.getBulkAsyncProcessor();
for (Long id : idList) {
DeleteRequest deleteRequest = new DeleteRequest(indexName, id.toString());
bulkProcessor.add(deleteRequest);
}
// 将数据刷新到es, 注意这一步执行后并不会立即生效,取决于bulkProcessor设置的刷新时间
bulkProcessor.flush();
} catch (Exception e) {
log.error("BulkProcessor,插入数据异常", e);
} finally {
try {
assert bulkProcessor != null;
boolean terminatedFlag = bulkProcessor.awaitClose(150L, TimeUnit.SECONDS);
log.error("result:{}", terminatedFlag);
} catch (Exception e) {
log.error("finally exception:", e);
}
}
public class ESCommonUtils {
@Autowired
private RestHighLevelClient restHighLevelClient;
@PreDestroy
public void destory() {
try {
restHighLevelClient.close();
} catch (Exception e) {
log.error("关闭restHighLevelClient异常:", e);
}
}
/**
* @return org.elasticsearch.action.bulk.BulkProcessor
* @description: 构建bulkProcessor接口 异步执行
*
*/
public BulkProcessor getBulkAsyncProcessor( ) {
BulkProcessor bulkProcessor = null;
try {
BiConsumer<BulkRequest, ActionListener<BulkResponse>> consumer =
(bulkRequest, bulkResponseActionListener) -> restHighLevelClient.bulkAsync(
bulkRequest, RequestOptions.DEFAULT, bulkResponseActionListener);
bulkProcessor = BulkProcessor.builder(consumer, this.getListener()
).setBulkActions(5000) // 达到刷新的条数
.setBulkSize(new ByteSizeValue(100L, ByteSizeUnit.MB)) // 达到 刷新的大小
.setConcurrentRequests(10) // 并发请求数量, 0不并发, 1并发允许执行
.setFlushInterval(TimeValue.timeValueSeconds(1)) // 固定刷新的时间频率
.setBackoffPolicy(BackoffPolicy.constantBackoff(
TimeValue.timeValueSeconds(1L), 3)) // 重试补偿策略
.build();
} catch (Exception e) {
log.error("构建BulkProcessor异常:", e);
try {
if (null != bulkProcessor) {
bulkProcessor.awaitClose(100L, TimeUnit.SECONDS);
}
} catch (Exception e1) {
log.error("关闭BulkProcessor异常", e1);
}
}
return bulkProcessor;
}
/**
* @return org.elasticsearch.action.bulk.BulkProcessor.Listener
* @description: 构建监听器
* @author:
*/
BulkProcessor.Listener getListener() {
return new BulkProcessor.Listener() {
@Override
public void beforeBulk(long executionId, BulkRequest request) {
log.info("Try to insert data number : " + request.numberOfActions());
}
@Override
public void afterBulk(long executionId, BulkRequest request, BulkResponse response) {
log.info("************** Success insert data number : " + request.numberOfActions() + " , id: "
+ executionId);
}
@Override
public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
log.error("Bulk is unsuccess : " + failure + ", executionId: " + executionId);
}
};
}
}