es 的代码也是相当的优雅!
bulk processor对于批处理的实现简洁、并且功能丰富。这个套路常用,记录一下。
1. 按照处理请求积压数触发server的请求(主动);
2. 按照处理请求积压的字节数触发server请求(主动);
3. 定时触发server请求(定时);
主动触发实现:
// 对外的添加请求接口
public BulkProcessor add(ActionRequest request, @Nullable Object payload) {
this.internalAdd(request, payload);
return this;
}
// private 确保添加逻辑正常执行
// 加锁-防止重复执行
private synchronized void internalAdd(ActionRequest request, @Nullable Object payload) {
this.ensureOpen();
this.bulkRequest.add(request, payload);
// 主动触发
this.executeIfNeeded();
}
// 判断是否执行
private void executeIfNeeded() {
this.ensureOpen();
// size, numbers任意符合即可执行
if(this.isOverTheLimit()) {
this.execute();
}
}
定时实现:
Executors.newScheduleThreadPool() 搞定。
参考:
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-bulk-processor.html