Java 消费者阅读-消费者偏移量传递无法阅读的消息

Java 消费者阅读-消费者偏移量传递无法阅读的消息,java,apache-kafka,Java,Apache Kafka,我试图从uu consumer_offset主题中使用,因为这似乎是检索有关消费者的卡夫卡指标(如消息延迟等)的最简单方法。理想的方法是从jmx访问它,但想先尝试一下,返回的消息似乎是加密的或不可读的。还尝试添加stringDeserializer属性。有人对如何纠正这个问题有什么建议吗?再次提到这一点是重复的 没有帮助,因为它没有引用我的问题,即在java中以字符串形式读取消息。还更新了代码,以使用kafka.client consumer尝试consumerRecord consumerP

我试图从uu consumer_offset主题中使用,因为这似乎是检索有关消费者的卡夫卡指标(如消息延迟等)的最简单方法。理想的方法是从jmx访问它,但想先尝试一下,返回的消息似乎是加密的或不可读的。还尝试添加stringDeserializer属性。有人对如何纠正这个问题有什么建议吗?再次提到这一点是重复的

没有帮助,因为它没有引用我的问题,即在java中以字符串形式读取消息。还更新了代码,以使用kafka.client consumer尝试consumerRecord

consumerProps.put("exclude.internal.topics",  false);
consumerProps.put("group.id" , groupId);
consumerProps.put("zookeeper.connect", zooKeeper);


consumerProps.put("key.deserializer",
  "org.apache.kafka.common.serialization.StringDeserializer");  
consumerProps.put("value.deserializer",
  "org.apache.kafka.common.serialization.StringDeserializer");

ConsumerConfig consumerConfig = new ConsumerConfig(consumerProps);
ConsumerConnector consumer = 
kafka.consumer.Consumer.createJavaConsumerConnector(
       consumerConfig);

Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
topicCountMap.put(topic, new Integer(1));
Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = 
   consumer.createMessageStreams(topicCountMap);
List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);

for (KafkaStream stream : streams) {

    ConsumerIterator<byte[], byte[]> it = stream.iterator();

    //errorReporting("...CONSUMER-KAFKA CONNECTION SUCCESSFUL!");

    while (it.hasNext()) {
         try {

             String mesg = new String(it.next().message());
             System.out.println( mesg);
consumerProps.put(“exclude.internal.topics”,false);
consumerProps.put(“group.id”,groupId);
consumerProps.put(“zookeeper.connect”,zookeeper);
consumerProps.put(“key.deserializer”,
“org.apache.kafka.common.serialization.StringDeserializer”);
consumerProps.put(“value.deserializer”,
“org.apache.kafka.common.serialization.StringDeserializer”);
ConsumerConfig ConsumerConfig=新的ConsumerConfig(ConsumerOps);
消费者连接器消费者=
kafka.consumer.consumer.createJavaConsumerConnector(
消费者配置);
Map topicCountMap=新HashMap();
topicCountMap.put(主题,新整数(1));
映射用户映射=
consumer.createMessageStreams(topicCountMap);
列表流=consumerMap.get(主题);
用于(卡夫卡斯特林流:流){
ConsumerIterator it=stream.iterator();
//错误报告(“…消费者-卡夫卡连接成功!”);
while(it.hasNext()){
试一试{
String mesg=新字符串(it.next().message());
系统输出打印LN(mesg);
代码更改:

try {       
    // errorReporting("CONSUMER-KAFKA CONNECTION INITIATING...");   
    Properties consumerProps = new Properties();
    consumerProps.put("exclude.internal.topics",  false);
    consumerProps.put("group.id" , "test");
    consumerProps.put("bootstrap.servers", servers);
    consumerProps.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");  
    consumerProps.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");

    //ConsumerConfig consumerConfig = new ConsumerConfig(consumerProps);
    //ConsumerConnector consumer = kafka.consumer.Consumer.createJavaConsumerConnector(
    //       consumerConfig);

    //Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
    //topicCountMap.put(topic, new Integer(1));
    //Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap);
    //List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);

    KafkaConsumer<String, String> kconsumer = new KafkaConsumer<>(consumerProps); 
    kconsumer.subscribe(Arrays.asList(topic)); 

    try {
        while (true) {
            ConsumerRecords<String, String> records = kconsumer.poll(10);

            for (ConsumerRecord<String, String> record : records)

                System.out.println(record.offset() + ": " + record.value());
        }
    } finally {
          kconsumer.close();
    }    
试试{
//错误报告(“消费者-卡夫卡连接启动…”);
Properties consumerProps=新属性();
consumerProps.put(“exclude.internal.topics”,false);
consumerProps.put(“group.id”、“test”);
consumerProps.put(“bootstrap.servers”,servers);
put(“key.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
put(“value.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
//ConsumerConfig ConsumerConfig=新的ConsumerConfig(ConsumerOps);
//ConsumerConnector consumer=kafka.consumer.consumer.createJavaConsumerConnector(
//消费者配置);
//Map topicCountMap=新HashMap();
//topicCountMap.put(主题,新整数(1));
//Map consumerMap=consumer.createMessageStreams(topicCountMap);
//列表流=consumerMap.get(主题);
卡夫卡消费者kconsumer=新卡夫卡消费者(消费者计划);
订阅(Arrays.asList(topic));
试一试{
while(true){
消费者记录记录=kconsumer.poll(10);
对于(消费者记录:记录)
System.out.println(record.offset()+“:”+record.value());
}
}最后{
kconsumer.close();
}    
以及下面消息的快照;在图像底部:


虽然可以直接从
\u消费者偏移量
主题中读取,但这不是推荐的或最简单的方法

如果可以使用Kafka 2.0,最好使用AdminClient API来描述组:

  • :查找特定组的所有偏移
  • :查找组成员的详细信息

如果您确实希望直接读取
\uuu消费者\u偏移量
,则需要解码记录以使其可读。这可以使用
GroupMetadataManager
类完成:

  • 可用于解码消息键并检索此条目所指的主题分区。这可返回两种类型的对象,对于消费者位置,您只对
    OffsetKey
    对象感兴趣

  • 可用于解码消息值(用于
    OffsetKey
    )并查找偏移信息

您链接的问题中的这一部分包含执行所有这些操作的框架代码


还请注意,您不应将记录反序列化为字符串,而应将其保留为原始字节,以便这些方法能够正确解码。

虽然可以直接从
\u消费者偏移量
主题中读取,但这不是推荐的或最简单的方法

如果可以使用Kafka 2.0,最好使用AdminClient API来描述组:

  • :查找特定组的所有偏移
  • :查找组成员的详细信息

如果您确实希望直接读取
\uuu消费者\u偏移量
,则需要解码记录以使其可读。这可以使用
GroupMetadataManager
类完成:

  • 可用于解码消息键并检索此条目所指的主题分区。这可返回两种类型的对象,对于消费者位置,您只对
    OffsetKey
    对象感兴趣

  • 可用于解码消息值(用于
    OffsetKey
    )并查找偏移信息

您链接的问题中的这一部分包含执行所有这些操作的框架代码


另外请注意,您不应将记录反序列化为字符串,而应将其保留为原始字节,以便这些方法能够正确解码它们。

感谢您的回答。我尚未完成此操作,但您的详细解释是我从任何地方得到的最佳回答。请欣赏。我不确定为什么会出现此问题重新打开。在我写下你链接到的答案后,我将其作为副本关闭。我可以参考那里的AdminClient方法,谢谢你的回复。我还没有完成这项工作,但你的详细解释是我从任何地方得到的最好的回复。