ES中批量处理BulkProcessor 的具体实现

    @Autowired
private ConfigVo configVo;
@Autowired
private EsClient client;
private static BulkProcessor bulkProcessor;


@PostConstruct
public void init() {

//异步批量请求
BiConsumer<BulkRequest, ActionListener<BulkResponse>> bulkConsumer =
(request, bulkListener) ->
client.getClient().bulkAsync(request, RequestOptions.DEFAULT, bulkListener);


bulkProcessor = BulkProcessor.builder(bulkConsumer,
new BulkProcessor.Listener() {
@Override
public void beforeBulk(long executionId, BulkRequest request) {
logger.info("序号:{} ,开始执行 {} 条数据批量操作。", executionId, request.numberOfActions());
}
@Override
public void afterBulk(long executionId, BulkRequest request, BulkResponse response) {
// 在每次执行BulkRequest后调用,通过此方法可以获取BulkResponse是否包含错误
if (response.hasFailures()) {
logger.error("Bulk {} executed with failures", executionId);
} else {
logger.info("序号:{} ,执行 {} 条数据批量操作成功,共耗费{}毫秒。", executionId, request.numberOfActions(), response.getTook().getMillis());
}
}
@Override
public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
logger.error("序号:{} 批量操作失败,总记录数:{} ,报错信息为:{}", executionId, request.numberOfActions(), failure.getMessage());
}

})
//每添加n个request,执行一次bulk操作
.setBulkActions(Integer.valueOf(configVo.getBulkActions()).intValue())
//每达到一定大小的请求时,执行一次bulk操作
.setBulkSize(new ByteSizeValue(Integer.valueOf(configVo.getBulkSizeMb()).intValue(), ByteSizeUnit.MB))
//每n秒执行一次bulk操作
.setFlushInterval(TimeValue.timeValueSeconds(Integer.valueOf(configVo.getFlushIntervalSeconds()).intValue()))
//设置并发请求数,默认是1,表示允许执行1个并发请求,积累bulk requests和发送bulk是异步的
.setConcurrentRequests(Integer.valueOf(configVo.getConcurrentRes()).intValue())
// .setBackoffPolicy(BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3))
.build();


}
posted @ 2019-11-27 17:02  再见傅里叶  阅读(5329)  评论(0编辑  收藏  举报