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本质上会被多个线程调用,进而导致了该问题