package com.github.ddth.kafka.internal;
import java.util.Collection;
import java.util.HashSet;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.ddth.kafka.IKafkaMessageListener;
import com.github.ddth.kafka.KafkaMessage;
public class KafkaMsgConsumerWorker extends Thread {
private final Logger LOGGER = LoggerFactory.getLogger(KafkaMsgConsumerWorker.class);
private KafkaMsgConsumer consumer;
private Collection<IKafkaMessageListener> messageListerners;
private String topic;
private boolean stop = false;
private ExecutorService executorService;
public KafkaMsgConsumerWorker(KafkaMsgConsumer consumer, String topic,
Collection<IKafkaMessageListener> messageListerners, ExecutorService executorService) {
super(KafkaMsgConsumerWorker.class.getCanonicalName() + " - " + topic);
this.consumer = consumer;
this.topic = topic;
this.messageListerners = messageListerners;
this.executorService = executorService;
}
/**
* Stops the worker.
*/
public void stopWorker() {
stop = true;
}
private void deliverMessage(KafkaMessage msg, Collection<IKafkaMessageListener> msgListeners) {
CountDownLatch counter = new CountDownLatch(msgListeners.size());
// AtomicInteger counter = new AtomicInteger(msgListeners.size());
for (final IKafkaMessageListener listerner : msgListeners) {
executorService.submit(new Runnable() {
@Override
public void run() {
try {
listerner.onMessage(msg);
} finally {
// counter.decrementAndGet();
counter.countDown();
}
}
});
}
// while (counter.get() > 0)
// ;
try {
counter.await();
} catch (InterruptedException e) {
LOGGER.warn(e.getMessage(), e);
}
}
@Override
public void run() {
Collection<IKafkaMessageListener> msgListeners = new HashSet<IKafkaMessageListener>();
while (!stop) {
msgListeners.clear();
msgListeners.addAll(messageListerners);
if (msgListeners.size() > 0) {
KafkaMessage msg = consumer.consume(topic, 100, TimeUnit.MILLISECONDS);
if (msg != null) {
deliverMessage(msg, msgListeners);
}
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
}
}
}