package us.b3k.kafka.ws.consumer;
import kafka.consumer.ConsumerConfig;
import us.b3k.kafka.ws.transforms.Transform;
import javax.websocket.Session;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class KafkaConsumerFactory {
private final ExecutorService executorService = Executors.newCachedThreadPool();
private final Properties configProps;
private final Transform outputTransform;
static public KafkaConsumerFactory create(Properties configProps, Class outputTransformClass) throws IllegalAccessException, InstantiationException {
Transform outputTransform = (Transform)outputTransformClass.newInstance();
outputTransform.initialize();
return new KafkaConsumerFactory(configProps, outputTransform);
}
private KafkaConsumerFactory(Properties configProps, Transform outputTransform) {
this.configProps = configProps;
this.outputTransform = outputTransform;
}
public KafkaConsumer getConsumer(String groupId, final String topics, final Session session) {
return getConsumer(groupId, Arrays.asList(topics.split(",")), session);
}
public KafkaConsumer getConsumer(String groupId, final List<String> topics, final Session session) {
if (groupId.isEmpty()) {
groupId = String.format("%s-%d", session.getId(), System.currentTimeMillis());
if (configProps.containsKey("group.id")) {
groupId = String.format("%s-%s", configProps.getProperty("group.id"), groupId);
}
}
Properties sessionProps = (Properties)configProps.clone();
sessionProps.setProperty("group.id", groupId);
KafkaConsumer consumer = new KafkaConsumer(new ConsumerConfig(sessionProps), executorService, outputTransform, topics, session);
consumer.start();
return consumer;
}
}