我遇到了这个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++;
}
}
答案 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
方法)。