kafka consumer 採用gson做反序列化 deserialize

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");
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章