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

zipkin2.collector.pulsar.LazyPulsarInit Maven / Gradle / Ivy

The newest version!
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.collector.pulsar;

import org.apache.pulsar.client.api.PulsarClient;
import org.apache.pulsar.client.api.PulsarClientException;
import zipkin2.CheckResult;
import zipkin2.collector.Collector;
import zipkin2.collector.CollectorMetrics;

import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;

class LazyPulsarInit {

  private final Collector collector;
  private final CollectorMetrics metrics;
  private final String topic;
  private final int concurrency;
  private final Map clientProps, consumerProps;
  public volatile PulsarClient result;
  final AtomicReference failure = new AtomicReference<>();

  LazyPulsarInit(PulsarCollector.Builder builder) {
    this.collector = builder.delegate.build();
    this.metrics = builder.metrics;
    this.topic = builder.topic;
    this.concurrency = builder.concurrency;
    this.clientProps = builder.clientProps;
    this.consumerProps = builder.consumerProps;
  }

  void init() {
    if (result == null) {
      synchronized (this) {
        if (result == null) {
          result = subscribe();
        }
      }
    }
  }

  private PulsarClient subscribe() {
    PulsarClient client;
    try {
      client = PulsarClient.builder()
          .loadConf(clientProps)
          .build();
    } catch (Exception e) {
      failure.set(CheckResult.failed(e));
      throw new RuntimeException("Pulsar client creation failed. " + e.getMessage(), e);
    }

    try {
      for (int i = 0; i < concurrency; i++) {
        PulsarSpanConsumer consumer = new PulsarSpanConsumer(topic, consumerProps, client, collector, metrics);
        consumer.startConsumer();
      }
      return client;
    } catch (Exception e) {
      try {
        client.close();
      } catch (PulsarClientException ex) {
        // Nobody cares me.
      }
      failure.set(CheckResult.failed(e));
      throw new RuntimeException("Pulsar Client is unable to subscribe to the topic(" + topic + "), please check the service.", e);
    }
  }

  void close() throws PulsarClientException {
    PulsarClient maybe = result;
    if (maybe != null) {
      result.close();
      result = null;
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy