All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.groupbyinc.common.blip.BlipClient Maven / Gradle / Ivy

There is a newer version: 198
Show newest version
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();
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy