package com.yirendai.infra.cicada.repository; import com.alibaba.fastjson.JSON; import com.yirendai.infra.cicada.config.CicadaCollectorProps; import com.yirendai.infra.cicada.util.elastic.IndexManager; import lombok.extern.slf4j.Slf4j; import org.elasticsearch.action.bulk.BulkProcessor; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.client.transport.TransportClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; import java.util.concurrent.TimeUnit; @Slf4j @Component public class TraceElasticRepository { @Autowired private CicadaCollectorProps props; @Autowired private TransportClient client; @Autowired private IndexManager indexManager; public <T> void upload(final String type, final List<T> objects) { final String indexName = indexManager.getCurrentIndexName(type); final BulkProcessor bulkProcessor = BulkProcessor.builder(client, new BulkProcessor.Listener() { @Override public void beforeBulk(final long executionId, final BulkRequest request) { } @Override public void afterBulk(final long executionId, // final BulkRequest request, // final BulkResponse response) { if (response.hasFailures()) { log.error("failed index data; {}", response.buildFailureMessage()); } } @Override public void afterBulk(final long executionId, // final BulkRequest request, // final Throwable failure) { log.error("failed upload data: {}", failure.getCause()); } }).build(); // add all datas to bulkProcessor for (final T object : objects) { bulkProcessor.add(new IndexRequest(indexName, props.getEsTypeName()).source(JSON.toJSONString(object))); } try { bulkProcessor.awaitClose(props.getEsBulkAwaitMinutes(), TimeUnit.MINUTES); } catch (InterruptedException ex) { log.error("execute bulkProcessor interrupted, type {}, error msg: {}", indexName, ex); } } }