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

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

package com.groupbyinc.common.blip;

import com.groupbyinc.common.util.ThreadUtils;
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.ExecutorService;
import java.util.concurrent.Executors;

public class BlipClient implements AutoCloseable {

  private static final int CONNECT_TIMEOUT = 100;
  private static final int CONNECTION_REQUEST_TIMEOUT = 100;
  private static final int SOCKET_TIMEOUT = 100;
  @SuppressWarnings("unused") public static final BlipClient EMPTY = new EmptyBlipClient();

  private BlipClientTask task;
  private final CloseableHttpClient httpClient;

  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(Map values) {
      // do nothing
    }

    @Override
    public void send(String... keyValues) {
      // do nothing
    }
  }

  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.httpClient = httpClient;
      task = new BlipClientTask(new URI(uri), environment, service, httpClient);
    } catch (URISyntaxException e) {
      throw new IllegalStateException("Couldn't create BlipClient", e);
    }
  }

  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 HashMap();
    if (keyValues != null) {
      for (int i = 0; i < keyValues.length; i += 2) {
        keyValueMap.put(keyValues[i], keyValues[i + 1]);
      }
    }
    send(keyValueMap);
  }

  public void send(final Map 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.getInstance()
        .offer(task.setValues(values));
  }

  @Override
  public void close() throws Exception {
    if (httpClient != null) {
      httpClient.close();
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy