package edu.fudan.weixin.kafka; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.concurrent.ExecutorService; import kafka.consumer.Consumer; import kafka.consumer.ConsumerConfig; import kafka.consumer.KafkaStream; import kafka.consumer.Whitelist; import kafka.javaapi.consumer.ConsumerConnector; import kafka.serializer.Decoder; import kafka.serializer.StringDecoder; import edu.fudan.eservice.common.utils.Config; import edu.fudan.eservice.common.utils.ThreadPoolHelper; public class KafkaConsumerHelper { private static ConsumerConnector consumer; private static KafkaConsumerHelper instance; Map<String, Set<ConsumeCallback>> callbacks; protected KafkaConsumerHelper() { callbacks = new HashMap<String, Set<ConsumeCallback>>(); } public static synchronized KafkaConsumerHelper getInstance() { if (instance == null) instance = new KafkaConsumerHelper(); return instance; } public ConsumerConnector getConsumer() { return consumer; } public void addCallback(ConsumeCallback callback) { if (callback == null) return; String[] topics = callback.getSubscribeTopics(); for (String tp : topics) { Set<ConsumeCallback> cbs = callbacks.get(tp); if (cbs == null) { cbs = new HashSet<ConsumeCallback>(); } cbs.add(callback); callbacks.put(tp, cbs); } } public synchronized void start() { Config conf= Config.getInstance(); Properties props = new Properties(); props.put("zookeeper.connect",conf .get("kafka.servers")); props.put("group.id", conf.get("kafka.groupid")); props.put("zookeeper.session.timeout.ms", "400"); props.put("zookeeper.sync.time.ms", "200"); props.put("auto.commit.interval.ms", "1000"); consumer = Consumer.createJavaConsumerConnector(new ConsumerConfig( props)); String topics = ""; for (String s : callbacks.keySet()) { topics += "," + s; } if (topics.length() > 0) { topics = topics.substring(1); Decoder<String> sd = new StringDecoder(null); List<KafkaStream<String, String>> streams = consumer .createMessageStreamsByFilter( new Whitelist(topics), Integer.parseInt(conf.get( "kafka.threads")), sd, sd); if (streams != null) { ExecutorService tph = ThreadPoolHelper.getInstance() .getSchPool(); for (KafkaStream<String, String> stream : streams) { tph.submit(new CallbackThread(callbacks, stream)); } } } } public void stop() { if (consumer != null) consumer.shutdown(); } }