I've configured my spring boot project using Kafka. I can receive and publish any string based message.
String message is not the best way for handling. It would be much more useful to have functionality for default converting message from string into object.
Implementing this functionality I've got need to move almost all my Kafka configurations from yml to java (using property). ...producer example
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, AccountSerializer.class);
return props;
}
@Bean
public ProducerFactory<String, Account> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigs());
}
@Bean
public KafkaTemplate<String, Account> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
The code works, but I accepted simplification. In best case I would like to have elegantly configured yml, may be some java changes. But doing it in direct way I'll get additional per 3 beans for configuring each kafkaTemplate and listenerFactory.
Is it possibly simplify the configurations for the future (I'll need more additional Serializer`Deserializer`)? How?
P.S.
I would like configure yml in similar way with this example :
spring:
kafka:
consumer:
group-id: foo
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
app:
topic:
foo: foo.t
but I'm not clear how configure here consumers\producers with different (De)Serializers, map ones on specified topic...