在KAFKA中生成和使用JSON

时间:2016-09-25 19:52:31

标签: java json apache-kafka

我们将在项目中部署Apache Kafka 2.10,并通过生产者和消费者之间的JSON对象进行通信。

到目前为止,我想我需要:

  1. 实现自定义序列化程序以将JSON转换为字节数组
  2. 实现自定义反序列化器以将字节数组转换为JSON对象
  3. 制作消息
  4. 阅读消费者类
  5. 中的消息

    关于第一点,我认为它应该是这样的:

    @Override
    public byte[] serialize(String topic, T data) {
        if (data == null)
            return null;
        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writeValueAsBytes(data);
        } catch (Exception e) {
            throw new SerializationException("Error serializing JSON message", e);
        }
    }
    

    T data可以作为字符串"{\"key\" : \"value\"}"传递。

    然而到目前为止有2-4点存在问题。我在自定义反序列化器中试过这个:

    @Override
    public JsonNode deserialize(String topic, byte[] bytes) {
        if (bytes == null)
            return null;
    
        JsonNode data;
        try {
            objectMapper = new ObjectMapper();
            data = objectMapper.readTree(bytes);
        } catch (Exception e) {
            throw new SerializationException(e);
        }
        return data;
    }
    

    在我的消费者中我尝试过:

        KafkaConsumer<String, TextNode> consumer = new KafkaConsumer<String, TextNode>(messageConsumer.properties);
        consumer.subscribe(Arrays.asList(messageConsumer.topicName));
        int i = 0;
        while (true) {
            ConsumerRecords<String, TextNode> records = consumer.poll(100);
            for (ConsumerRecord<String, TextNode> record : records) {
                System.out.printf("offset = %d, key = %s, value = %s\n", record.offset(), record.key(), record.value().asText());
            }
        }
    

    我认为这会生成一个正确的原始json字符串,但我调用record.value().asText()的所有内容都是一些哈希字符串"IntcImtleVwiIDogXCJ2YWx1ZVwiIH0i"

    非常感谢任何通过卡夫卡JSON进行交流的建议或示例。

2 个答案:

答案 0 :(得分:0)

有一个内置的JsonSerializer和Apache Kafka。我不确定2.10对于一个版本是什么意思,但是当前版本0.10.0.1肯定可以为你做序列化。只需查看JsonSerializer类。

答案 1 :(得分:0)

我建议您将UTF-8编码用作字符串JSON序列化器:
1.生产者以JSON字符串("{\"key\" : \"value\"}")的形式获取数据
2.生产者使用UTF-8(jsonString.getBytes(StandardCharsets.UTF_8);)将JSON字符串序列化为字节
3.生产者将此字节发送给Kafka 4.消费者从Kafka读取字节 5.消费者使用UTF-8(new String(consumedByteArray, StandardCharsets.UTF_8);)将字节反序列化为JSON字符串
6.消费者使用JSON字符串

我故意不使用您的代码,因此流程是可以理解的,我认为您可以轻松地将此示例应用于您的项目:)