springboot 配置kafka
@Bean
public ConsumerFactory<String, byte[]> byteArrayConsumerFactory() {
GsonDeserializer gsonDeserializer = new GsonDeserializer<>();
Map<String, String> config = new HashMap<>();
config.put(GsonDeserializer.CONFIG_VALUE_CLASS, WechatUserLocation.class.getName());
gsonDeserializer.configure(config, false);
gsonDeserializer.close();
return new DefaultKafkaConsumerFactory<>(
kafkaProperties.buildConsumerProperties(), new StringDeserializer(), gsonDeserializer
);
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, byte[]> kafkaListenerByteArrayContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, byte[]> factory =
new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(byteArrayConsumerFactory());
return factory;
}
GsonDeserializer
public class GsonDeserializer<T> implements Deserializer<T> {
public static final String CONFIG_VALUE_CLASS = "value.deserializer.class";
public static final String CONFIG_KEY_CLASS = "key.deserializer.class";
private Class<T> cls;
private Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new DateTimeDeserializer()).create();
@Override
public void configure(Map<String, ?> config, boolean isKey) {
String configKey = isKey ? CONFIG_KEY_CLASS : CONFIG_VALUE_CLASS;
String clsName = String.valueOf(config.get(configKey));
try {
cls = (Class<T>) Class.forName(clsName);
} catch (ClassNotFoundException e) {
System.err.printf("Failed to configure GsonDeserializer. " +
"Did you forget to specify the '%s' Stringproperty ?%n",
configKey);
}
}
@Override
public T deserialize(String topic, byte[] bytes) {
return (T) gson.fromJson(new String(bytes), cls);
}
@Override
public void close() {}
}
配置listener
@KafkaListener( topics = "${kafka.topic-wechat-userlocation}", clientIdPrefix = "zcc-log",
containerFactory = "kafkaListenerByteArrayContainerFactory")
public void listenAsObject(ConsumerRecord<String, WechatUserLocation> cr,
@Payload WechatUserLocation payload) {
log.info("Logger 1 [JSON] received key {}: Type [{}] | Payload: {} | Record: {}", cr.key(),
typeIdHeader(cr.headers()), payload, cr.toString());
}
private static String typeIdHeader(Headers headers) {
return StreamSupport.stream(headers.spliterator(), false)
.filter(header -> header.key().equals("__TypeId__"))
.findFirst().map(header -> new String(header.value())).orElse("N/A");
}