package com.yirendai.infra.cicada.transfer.impl; import com.alibaba.dubbo.common.utils.CollectionUtils; import com.alibaba.fastjson.JSON; import com.yirendai.infra.cicada.entity.trace.Span; import com.yirendai.infra.cicada.transfer.DeliverService; import org.apache.http.HttpResponse; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpPost; import org.apache.http.concurrent.FutureCallback; import org.apache.http.entity.StringEntity; import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; import org.apache.http.impl.nio.client.HttpAsyncClients; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; public class HttpPostDeliverService implements DeliverService { private static final Logger LOGGER = LoggerFactory.getLogger(HttpPostDeliverService.class); // private CloseableHttpClient httpClient; private final CloseableHttpAsyncClient httpClient; private final HttpPost httpPost; public HttpPostDeliverService(final String postUrl, final int connectTimeout, final int soTimeout) { httpClient = HttpAsyncClients.createDefault(); httpClient.start(); httpPost = new HttpPost(postUrl); final RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(connectTimeout).setSocketTimeout(soTimeout).build(); httpPost.setConfig(requestConfig); httpPost.setHeader("Content-type", "application/json"); httpPost.setHeader("Content-Type", "text/html;charset=UTF-8"); } public boolean deliver(final Span span) { boolean ret = false; if (span == null) { LOGGER.error("no span!"); ret = false; } else { final List<Span> spanList = new ArrayList<Span>(); spanList.add(span); ret = deliver(spanList); } return ret; } public boolean deliver(final List<Span> spanList) { boolean ret = false; if (CollectionUtils.isEmpty(spanList)) { LOGGER.error("spanList is Empty!"); ret = false; } else { if (httpClient == null || httpPost == null) { LOGGER.error("httpClient({}) or httpPost({}) is null", httpClient, httpPost); ret = false; } else { final long startTime = System.currentTimeMillis(); final int spanSize = spanList.size(); final String spanListJson = JSON.toJSONString(spanList); final StringEntity postingString = new StringEntity(spanListJson, "utf-8"); httpPost.setEntity(postingString); httpClient.execute(httpPost, new FutureCallback<HttpResponse>() { public void completed(final HttpResponse response) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("[push({})] [http_status:200] [spanSize:{}] [{}ms]", spanListJson, spanSize, (System.currentTimeMillis() - startTime)); } } public void failed(final Exception ex) { LOGGER.error("[push({})] [{}] [error:{}]", httpPost.getURI(), spanListJson, ex); } public void cancelled() { LOGGER.error("[push({})] [http_status:cancelled] [{}ms]", spanListJson, (System.currentTimeMillis() - startTime)); } }); ret = true; } } return ret; } }