Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对ConsumerIterator对象的迭代似乎是永无止境的循环_Java_Apache Kafka_Kafka Consumer Api - Fatal编程技术网

Java 对ConsumerIterator对象的迭代似乎是永无止境的循环

Java 对ConsumerIterator对象的迭代似乎是永无止境的循环,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我尝试在版本0.8.2.1中为ApacheKafka实现Java客户机。我知道新版本的Java消费者API将在新版本的ApacheKafka中提供,但现在我必须在当前版本中实现消费者客户端 所以我已经做了,但是我在检查收到的消息的数量时遇到了问题。问题似乎是在对ConsumerIterator对象进行迭代以获取消息及其id。迭代似乎是永无止境的循环。请看以下代码: public class TestKafkaConsumer extends Thread{ private final stat

我尝试在版本0.8.2.1中为ApacheKafka实现Java客户机。我知道新版本的Java消费者API将在新版本的ApacheKafka中提供,但现在我必须在当前版本中实现消费者客户端

所以我已经做了,但是我在检查收到的消息的数量时遇到了问题。问题似乎是在对ConsumerIterator对象进行迭代以获取消息及其id。迭代似乎是永无止境的循环。请看以下代码:

public class TestKafkaConsumer extends Thread{

private final static Logger logger = Logger.getLogger(TestKafkaConsumer.class);
private Properties appProperties;
private String topic;
private ZookeeperConsumerConnector consumer;

public TestKafkaConsumer() throws Exception {
    topic = "topic";
    consumer = (ZookeeperConsumerConnector) Consumer.createJavaConsumerConnector(createConsumerConfig());
}

public static void main( String[] args ){
    PropertyConfigurator.configure("log4j.properties");
    try {
        TestKafkaConsumer testConsumer = new TestKafkaConsumer();
        testConsumer.start();
    } catch (Exception e) {
        logger.error("Error create consumer ", e);
    }

}

@Override
public void run() {
    logger.info("Consumer thread - start");
    Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
    topicCountMap.put(topic, new Integer(1));
    Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = (Map<String, List<KafkaStream<byte[], byte[]>>>) consumer
            .createMessageStreams(topicCountMap);
    KafkaStream<byte[], byte[]> stream = consumerMap.get(topic).get(0);
    ConsumerIterator<byte[], byte[]> it = stream.iterator();
    //logger.info("Count of consumed messages: " + it.length());
    long msgCount = 0;
    while (it.hasNext()) {
            MessageAndMetadata<byte[], byte[]> messageAndMetadata  = it.next();
            logger.info("Key: " + new String(messageAndMetadata.key()));
            logger.info("Message: " + new String(messageAndMetadata.message()));
            msgCount++;
        }
    logger.info("Summary count of consumed messages: " + msgCount); 
}

private ConsumerConfig createConsumerConfig() throws Exception{
    logger.info("createConsumerConfig - start");
    Properties props = new Properties();
    props.put("zookeeper.connect", "localhost:2181");
    props.put("group.id","testGrp");
    props.put("zookeeper.session.timeout.ms", "400");
    props.put("zookeeper.sync.time.ms", "200");
    props.put("auto.commit.interval.ms", "10000");
    logger.info("createConsumerConfig - finish");
    return new ConsumerConfig(props);                
}

}
公共类TestKafkaConsumer扩展线程{
私有最终静态记录器Logger=Logger.getLogger(TestKafkaConsumer.class);
私人物业;
私有字符串主题;
私人动物园管理员消费者;
public TestKafkaConsumer()引发异常{
topic=“topic”;
consumer=(ZookeeperConsumerConnector)consumer.createJavaConsumerConnector(createConsumerConfig());
}
公共静态void main(字符串[]args){
PropertyConfigurator.configure(“log4j.properties”);
试一试{
TestKafkanConsumer testConsumer=新的TestKafkanConsumer();
testConsumer.start();
}捕获(例外e){
logger.error(“错误创建消费者”,e);
}
}
@凌驾
公开募捐{
logger.info(“消费者线程-启动”);
Map topicCountMap=新HashMap();
topicCountMap.put(主题,新整数(1));
映射消费者映射=(映射)消费者
.createMessageStreams(topicCountMap);
KafkaStream stream=consumerMap.get(主题).get(0);
ConsumerIterator it=stream.iterator();
//logger.info(“消耗的消息计数:+it.length());
长msgCount=0;
while(it.hasNext()){
MessageAndMetadata MessageAndMetadata=it.next();
logger.info(“Key:+新字符串(messageAndMetadata.Key());
logger.info(“Message:+新字符串(messageAndMetadata.Message()));
msgCount++;
}
logger.info(“已消耗消息的汇总计数:“+msgCount”);
}
私有ConsumerConfig CreateCummerConfig()引发异常{
info(“createConsumerConfig-start”);
Properties props=新属性();
props.put(“zookeeper.connect”,“localhost:2181”);
props.put(“group.id”、“testGrp”);
props.put(“zookeeper.session.timeout.ms”,“400”);
道具放置(“zookeeper.sync.time.ms”,“200”);
props.put(“auto.commit.interval.ms”、“10000”);
info(“createConsumerConfig-finish”);
返回新的消费者配置(道具);
}
}
问题是日志文件中没有显示包含已消费消息计数的日志条目,所以我认为迭代永远不会结束。我已经测试过所有消息都已读取。所以所有的记录都会被迭代,但程序不会留下循环。此外,我还注意到,当我在开始循环(取消注释适当行)之前尝试获取ConsumerIterator的长度(或大小)时,程序似乎在此处停止,循环甚至没有启动-日志文件中没有关于读取记录的条目


问题在哪里?课堂上的消费主义者?也许我做错了什么。如果有人遇到这样的问题并能帮助我,我将不胜感激。

javadoc for ConsumerIterator声明“一个迭代器,阻塞,直到可以从提供的队列中读取值为止。”


这可能是问题所在吗

ConsumerIterator的javadoc声明“一个迭代器,阻塞,直到可以从提供的队列中读取一个值。”


这可能是问题所在吗

是的,这就是问题所在。当我在一段时间后关闭一个线程和使用者时,我会得到有关摘要消息的信息。非常感谢。是的,这就是问题所在。当我在一段时间后关闭一个线程和使用者时,我会得到有关摘要消息的信息。谢谢。