multiple points java_spring kafka: multiple points问题

项目中需要消费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 records, Acknowledgment acknowledgment) {

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值