spring kafka: multiple points问题

2020-12-15  本文已影响0人  轰鸣龙

项目中需要消费kafka,之前是用官方的java api来写的,最近尝试使用spring kafka来消费

protected SimpleDateFormat sdf = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss",Locale.ENGLISH);
@KafkaListener(id = "springGroup",clientIdPrefix = "spring",topics = {"xxxx"},containerFactory = "batchContainerFactory",errorHandler = "myErrorHandler")
    public void batchListener(ConsumerRecords<String, JsonObject> records, Acknowledgment acknowledgment) {
        for(ConsumerRecord<String, JsonObject> record : records){
            // 日志中一般会有时间戳
            String log = record.value().get("message_time").getAsString();
            try{

                  String requestTime = sdf.format(log);
            }catch (Exception e) {
                logger.error("log parse exception {}",record.value());
                logger.error("{}", e.getMessage(),e);
            }

}

上线后,有大量的异常日志,如:
java.lang.NumberFormatException: For input string: "115.E115E22"
java.lang.NumberFormatException: For input string: ""
一开始以为是时间格式不一致导致解析异常,打印原始日志记录record.value并未发现异常
最终在错误日志里面还发现了java.lang.NumberFormatException: multiple points
跟着这个很容易查到原因是:在多线程环境下使用了线程不安全SimpleDateFormat
虽然这里并未显示地创建多个线程,但是batchListener本质上会被多个线程调用,进而导致了该问题

上一篇下一篇

猜你喜欢

热点阅读