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

com.twitter.hbc.ClientBuilder Maven / Gradle / Ivy

/**
 * Copyright 2013 Twitter, Inc.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 **/

package com.twitter.hbc;

import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.twitter.hbc.core.Hosts;
import com.twitter.hbc.core.HttpHosts;
import com.twitter.hbc.core.endpoint.RawEndpoint;
import com.twitter.hbc.core.endpoint.StreamingEndpoint;
import com.twitter.hbc.core.event.Event;
import com.twitter.hbc.core.processor.HosebirdMessageProcessor;
import com.twitter.hbc.httpclient.BasicClient;
import com.twitter.hbc.httpclient.auth.Authentication;
import org.apache.http.HttpVersion;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * A builder class for our BasicClient.
 */
public class ClientBuilder {

  private static final AtomicInteger clientNum = new AtomicInteger(0);
  protected Authentication auth;
  protected Hosts hosts;
  protected HosebirdMessageProcessor processor;
  protected StreamingEndpoint endpoint;
  protected boolean enableGZip;
  protected String name;
  protected RateTracker rateTracker;
  protected final ExecutorService executorService;
  protected BlockingQueue eventQueue;
  protected ReconnectionManager reconnectionManager;
  protected int socketTimeoutMillis;
  protected int connectionTimeoutMillis;
  protected ClientConnectionManager connectionManager;

  private static String loadVersion() {
    String userAgent = "Hosebird-Client";
    try {
      InputStream stream = ClientBuilder.class.getClassLoader().getResourceAsStream("build.properties");
      try {
        Properties prop = new Properties();
        prop.load(stream);

        String version = prop.getProperty("version");
        userAgent += " " + version;
      } finally {
        stream.close();
      }
    } catch (IOException ex) {
      // ignore
    }
    return userAgent;
  }

  private static final String USER_AGENT = loadVersion();

  public ClientBuilder() {
    enableGZip = true;
    name = "hosebird-client-" + clientNum.getAndIncrement();
    ThreadFactory threadFactory = new ThreadFactoryBuilder()
            .setDaemon(true)
            .setNameFormat("hosebird-client-io-thread-%d")
            .build();
    executorService = Executors.newSingleThreadExecutor(threadFactory);

    ThreadFactory rateTrackerThreadFactory = new ThreadFactoryBuilder()
            .setDaemon(true)
            .setNameFormat("hosebird-client-rateTracker-thread-%d")
            .build();

    ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1, rateTrackerThreadFactory);
    rateTracker = new BasicRateTracker(30000, 100, true, scheduledExecutor);
    reconnectionManager = new BasicReconnectionManager(5);

    socketTimeoutMillis = 60000;
    connectionTimeoutMillis = 4000;

    connectionManager = new PoolingClientConnectionManager();
  }

  /**
   * @param name Name of the client used for logging and other diagnostic purposes.
   */
  public ClientBuilder name(String name) {
    this.name = Preconditions.checkNotNull(name);
    return this;
  }

  /**
   * @param gzip Turn gzip on or off. Enabled by default
   */
  public ClientBuilder gzipEnabled(boolean gzip) {
    this.enableGZip = gzip;
    return this;
  }

  /**
   * @param host Http host in the form of ://
   */
  public ClientBuilder hosts(String host) {
    this.hosts = new HttpHosts(Preconditions.checkNotNull(host));
    return this;
  }

  public ClientBuilder hosts(Hosts hosts) {
    this.hosts = Preconditions.checkNotNull(hosts);
    return this;
  }

  /**
   * @param endpoint StreamingEndpoint that the client will connect to
   */
  public ClientBuilder endpoint(StreamingEndpoint endpoint){
    this.endpoint = Preconditions.checkNotNull(endpoint);
    return this;
  }

  public ClientBuilder authentication(Authentication auth) {
    this.auth = auth;
    return this;
  }

  public ClientBuilder processor(HosebirdMessageProcessor processor) {
    this.processor = processor;
    return this;
  }

  public ClientBuilder eventMessageQueue(BlockingQueue events) {
    this.eventQueue = events;
    return this;
  }

  public ClientBuilder socketTimeout(int millis) {
    this.socketTimeoutMillis = millis;
    return this;
  }

  public ClientBuilder connectionTimeout(int millis) {
    this.connectionTimeoutMillis = millis;
    return this;
  }

  /**
   * @param retries Number of retries to attempt when we experience retryable connection errors
   */
  public ClientBuilder retries(int retries) {
    this.reconnectionManager = new BasicReconnectionManager(retries);
    return this;
  }

  public ClientBuilder reconnectionManager(ReconnectionManager manager) {
      this.reconnectionManager = Preconditions.checkNotNull(manager);
      return this;
  }

  public ClientBuilder endpoint(String uri, String httpMethod) {
    Preconditions.checkNotNull(uri);
    this.endpoint = new RawEndpoint(uri, httpMethod);
    return this;
  }

  public ClientBuilder rateTracker(RateTracker rateTracker) {
      this.rateTracker = Preconditions.checkNotNull(rateTracker);
      return this;
  }

  public ClientBuilder connectionManager(ClientConnectionManager connectionManager) {
      this.connectionManager = Preconditions.checkNotNull(connectionManager);
      return this;
  }

  public BasicClient build() {
    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setUserAgent(params, USER_AGENT);
    HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);
    HttpConnectionParams.setConnectionTimeout(params, connectionTimeoutMillis);
    return new BasicClient(name, hosts, endpoint, auth, enableGZip, processor, reconnectionManager,
            rateTracker, executorService, eventQueue, params, connectionManager);
  }
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy