com.groupbyinc.common.blip.BlipClient Maven / Gradle / Ivy
package com.groupbyinc.common.blip;
import com.groupbyinc.common.util.ThreadUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class BlipClient implements AutoCloseable {
@SuppressWarnings("unused") public static final BlipClient EMPTY = new EmptyBlipClient();
private static final int CONNECT_TIMEOUT = 1000;
private static final int CONNECTION_REQUEST_TIMEOUT = 1000;
private static final int SOCKET_TIMEOUT = 1000;
public static final String NAMESPACE = "namespace";
private String namespace = System.getProperty(NAMESPACE, "");
private static class BlipClientQueue {
private static BlipClientQueue instance = new BlipClientQueue();
private ExecutorService queue = Executors.newFixedThreadPool(100, ThreadUtils.defaultThreadFactory("blip"));
private BlipClientQueue() {
}
public static BlipClientQueue getInstance() {
return instance;
}
public void offer(final BlipClientTask task) {
queue.submit(task);
}
}
private static class EmptyBlipClient extends BlipClient {
EmptyBlipClient() {
super("http://localhost:1000", null, null);
}
@Override
public void send(String... keyValues) {
// do nothing
}
@Override
public void send(Map values) {
// do nothing
}
}
private final CloseableHttpClient httpClient;
private URI uri;
private String environment;
private String service;
public BlipClient(String uri, String environment, String service) {
this(uri, environment, service, createHttpClient());
}
public BlipClient(String uri, String environment, String service, CloseableHttpClient httpClient) {
try {
this.uri = new URI(uri);
} catch (URISyntaxException e) {
throw new IllegalStateException("Couldn't create BlipClient", e);
}
this.environment = environment;
this.service = service;
this.httpClient = httpClient;
}
private static CloseableHttpClient createHttpClient() {
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(200);
cm.setDefaultMaxPerRoute(200);
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECT_TIMEOUT).setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build();
return clientBuilder.setConnectionManager(cm).setDefaultRequestConfig(requestConfig).build();
}
public void send(String... keyValues) {
Map keyValueMap = new ConcurrentHashMap<>();
if (keyValues != null) {
for (int i = 0; i < keyValues.length; i += 2) {
String key = keyValues[i];
String value = keyValues[i + 1];
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) {
keyValueMap.put(key, value);
}
}
}
send(keyValueMap);
}
public void send(final Map values) {
if (MapUtils.isNotEmpty(values)) {
if (StringUtils.isBlank(values.get("eventType"))) {
throw new IllegalStateException("No eventType found in blip map. You must define an eventType or we can't use this information.");
}
BlipClientQueue queue = BlipClientQueue.getInstance();
queue.offer(new BlipClientTask(uri, environment, service, httpClient).setValues(additionalMetadata(values)));
}
}
private Map additionalMetadata(Map values) {
Map newValues = new HashMap<>(values);
newValues.put(NAMESPACE, namespace);
return newValues;
}
@Override
public void close() throws Exception {
if (httpClient != null) {
httpClient.close();
}
}
}