根据带注释的方法值类型定义通用Protobuf转换器

时间:2018-07-23 09:20:30

标签: java apache-kafka converter protocol-buffers spring-kafka

目前,我在Spring Kafka中使用JSON作为消息,这非常简单,并且几乎不需要任何编码即可:

@KafkaListener(topics = "foo.t",)
public void receive(Foo payload) {
    LOG.info("received payload='{}'", payload);
    doMagic(payload);
}

@KafkaListener(topics = "bar.t",)
public void receive(Bar payload) {
    LOG.info("received payload='{}'", payload);
    doMagic(payload);
}

和一些配置:

# Kafka Config
spring.kafka.bootstrap-servers=broker.kafka
spring.kafka.consumer.group-id=some-app
spring.kafka.consumer.properties.value.deserializer=org.springframework.kafka.support.serializer.JsonDeserializer
spring.kafka.consumer.properties.spring.json.trusted.packages=com.example.someapp.dto

这很有用(很棒),因为内容/类型信息是用JSON编码的,因此可以仅从字节中恢复。 (与此同时也存在问题,但它可以正常工作) 但是在protobuf中,我没有这些元信息,或者至少我不知道在哪里可以找到它们。

问题:

有没有一种方法可以声明适用于多种类型的通用kafka MessageConverter,而不会从窗口中抛出所有漂亮的抽象/自动配置呢?

(我也想将其用于JSON,因为对消息的内容/数据类型进行编码(如果消息同时具有一些安全性和兼容性问题)

我想避免这种解决方案:https://stackoverflow.com/a/46670801/4573065

替代

编写一个尝试所有kafka类的消息转换器/ Deserializer

@Override
public T deserialize(String topic, byte[] data) {
    try {
        return (T) Foo.parse(data);
    } catch (Exception e) {
        try {
            return (T) Bar.parse(data);
        } catch (Exception e1) {
            throw e
        }
    }
}

但是,这可能会抵消我希望使用二进制格式获得的所有性能提升。

另一种选择是静态映射topic-> content类型,但这仍然容易出错,或者至少很难为您配置spring。


编辑:我的制作人如下:

public void send(String message) {
    kafkaTemplate.send("string.t", message);
}

0 个答案:

没有答案