异常原因
你好! 由于业务需要,多本书的图片会通过本地服务上传至服务器,在一次大批量上传10本以上书籍的时候发现某几本书缺少几张图片。经过排查 ,发现是多线程的问题。改用线程池后仍然无效。
限制贴上部分代码
代码
加入同步关键字和睡眠机制仍然无效,加入线程池也无效。
List<Page> pageList = new Vector<>();
CountDownLatch countDownLatch = new CountDownLatch(fileNameList.size());
int count = 0;
for (String fileName : fileNameList) {
++count;
log.info("本次上传的是第" + count + "张图片,图片名称为===> " + fileName);
uploadExecutor.submit(() -> {
BufferedImage bufferedImage = null;
try {
UploadResult uploadResult = null;
for (int i = 0; i < 10; i++) {
//上传代码省略
if (uploadResult != null) break;
}
if (uploadResult == null || StringUtils.isEmpty(uploadResult.getUrl()) || uploadResult.getUrl().contains("error")) {
log.info("文件" + fileName + "上传失败");
}
bufferedImage = ImageIO.read(new File(folder + "/" + fileName));
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
Page page = new Page();
省略
page.setPageName(fileName);
log.info("图片==> " + fileName + " 成功上传,成功地址为==> " + page.getPageUrl());
pageList.add(page);
} catch (Exception e) {
log.info("上传失败,原因为===》" + e.getMessage());
log.error("上传图片异常:" + e.getMessage());
} finally {
if (bufferedImage != null) {
bufferedImage.flush();
}
countDownLatch.countDown();
}
});
try {
//休眠50毫秒
Thread.sleep(50L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
log.error("锁失败");
}
最后排查出来是这一行代码的问题
bufferedImage = ImageIO.read(new File(folder + “/” + fileName));
这个ImageIO类是线程不安全的,过了这一行值就乱了。
最后加入判断,如果上传成功的数量和需要上传的数量不符合,线程就睡眠一秒,继续重试。
最后终于解决了,真是天坑啊。
但是任然不知道这个IO为啥不报错,异常处理的日志没有打印出来