
com.expedia.www.haystack.pipes.commons.kafka.KafkaStreamBuilderBase Maven / Gradle / Ivy
package com.expedia.www.haystack.pipes.commons.kafka;
import com.expedia.open.tracing.Span;
import com.expedia.www.haystack.pipes.commons.serialization.SerdeFactory;
import org.apache.kafka.common.serialization.Serde;
import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.kstream.ForeachAction;
import org.apache.kafka.streams.kstream.KStream;
import org.apache.kafka.streams.kstream.KStreamBuilder;
import org.apache.kafka.streams.processor.ProcessorSupplier;
public abstract class KafkaStreamBuilderBase implements KafkaStreamBuilder, Main {
private final KafkaStreamStarter kafkaStreamStarter;
private final SerdeFactory serdeFactory;
private final String application;
private final KafkaConfig kafkaConfig;
private final ForeachAction foreachAction;
private final ProcessorSupplier processorSupplier;
public KafkaStreamBuilderBase(KafkaStreamStarter kafkaStreamStarter,
SerdeFactory serdeFactory,
String application,
KafkaConfig kafkaConfig,
ForeachAction foreachAction) {
this(kafkaStreamStarter, serdeFactory, application, kafkaConfig, foreachAction, null);
}
public KafkaStreamBuilderBase(KafkaStreamStarter kafkaStreamStarter,
SerdeFactory serdeFactory,
String application,
KafkaConfigurationProvider kafkaConfigurationProvider,
ProcessorSupplier processorSupplier) {
this(kafkaStreamStarter, serdeFactory, application, kafkaConfigurationProvider, null, processorSupplier);
}
private KafkaStreamBuilderBase(KafkaStreamStarter kafkaStreamStarter,
SerdeFactory serdeFactory,
String application,
KafkaConfig kafkaConfig,
ForeachAction foreachAction,
ProcessorSupplier processorSupplier) {
this.kafkaStreamStarter = kafkaStreamStarter;
this.serdeFactory = serdeFactory;
this.application = application;
this.kafkaConfig = kafkaConfig;
this.foreachAction = foreachAction;
this.processorSupplier = processorSupplier;
}
@Override
public void buildStreamTopology(KStreamBuilder kStreamBuilder) {
final Serde stringSerde = Serdes.String();
final Serde spanSerde = serdeFactory.createJsonProtoSpanSerde(application);
final String fromTopic = kafkaConfig.fromtopic();
final KStream stream = kStreamBuilder.stream(stringSerde, spanSerde, fromTopic);
if(foreachAction != null) {
stream.foreach(foreachAction);
}
if(processorSupplier != null) {
stream.process(processorSupplier);
}
}
/**
* main() is an instance method because it is called by the static void *IsActiveController.main(String [] args)
* methods; making it an instance method facilitates unit testing.
*/
@Override
public void main() {
kafkaStreamStarter.createAndStartStream(this);
}
}