Kafka Consumer - Java实现

时间:2016-02-22 23:11:30

标签: java spring apache-kafka

我遇到了这个link来实现Java中的KafkaConsumer。下面列出的代码读取流并处理消息。这段代码一旦启动就会继续监听收到的消息吗?如果是这样,它如何继续运行并继续消费?

public void run(int a_numThreads) {
    Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
    topicCountMap.put(topic, new Integer(a_numThreads));
    Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap);
    List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);

    // now launch all the threads
    //
    executor = Executors.newFixedThreadPool(a_numThreads);

    // now create an object to consume the messages
    //
    int threadNumber = 0;
    for (final KafkaStream stream : streams) {
        executor.submit(new ConsumerTest(stream, threadNumber));
        threadNumber++;
    }
}

1 个答案:

答案 0 :(得分:2)

代码将在启动时继续侦听传入消息,因为它使用ThreadPool(threadpool = a_numThreads中的线程数)并且线程池中的每个线程都执行一个Consumer( ConsumerTest)。

如果仔细查看ConsumerTest类,您会发现存在无限循环。 it.hasNext()正在阻止(请参阅ConsumerIterator),以便消费者始终等待下一条消息:

public void run() {
        ConsumerIterator<byte[], byte[]> it = m_stream.iterator();
        while (it.hasNext())
            System.out.println("Thread " + m_threadNumber + ": " + new String(it.next().message()));
        System.out.println("Shutting down Thread: " + m_threadNumber);
}

如上所述,如果在指定的时间间隔后没有消息可供使用,则可以使用属性consumer.timeout.ms设置超时Throw消费者的超时异常,但是默认值为-1(无超时),因此默认情况下,使用者将始终保持消费消息,直到消费者和执行者关闭为止(请参阅示例中的shutdown方法)。