异步操作中数据库插入失败,但是代码时没有问题的
单步调试的状态下,程序可以正确执行
上代码
CompletableFuture.runAsync(() ->{
String filePath;
try {
filePath = fileUtil.upload(new FileInputStream(finalTempFile),file.getOriginalFilename(), OssConstants.FILE_ADDRESS);
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
FileInfo fileInfo = BeanUtil.toBeanIgnoreCase(fileUploadDTO, FileInfo.class, true);
fileInfo.setPushDate(LocalDateTimeUtil.parseDate(DateUtil.today()));
fileInfo.setUserId(user.getId());
fileInfo.setPath(filePath);
fileInfo.setIsPass(UserConstants.FILE_WAIT_CHECK);
fileInfo.setSchoolId(user.getSchoolId());
fileInfo.setSchoolName(SchoolEnum.getNameByCode(user.getSchoolId()));
fileInfoMapper.insert(fileInfo);
} catch (Exception e) {
log.error("保存失败{}",e.getMessage());
}
});
这里是我的代码片段,使用了异步操作,先上传了文件,然后插入数据库中。
这段代码之前没有问题,但是我在上传代码之前,加入了对文件内容的检验,耗时较长,然后代码也没有报错,只是在最后fileInfoMapper.insert(fileInfo);
的时候,插入失败,查看日志
2024-07-26T19:51:42.156+08:00 INFO 400 --- [nio-8000-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-07-26T19:51:42.156+08:00 INFO 400 --- [nio-8000-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2024-07-26T19:51:42.157+08:00 INFO 400 --- [nio-8000-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
2024-07-26T19:51:46.031+08:00 INFO 400 --- [ File Watcher] rtingClassPathChangeChangedEventListener : Restarting due to 1 class path change (0 additions, 0 deletions, 1 modification)
2024-07-26T19:51:46.060+08:00 INFO 400 --- [ Thread-5] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2024-07-26T19:51:46.061+08:00 INFO 400 --- [ Thread-5] o.a.c.c.C.[Tomcat].[localhost].[/] : Destroying Spring FrameworkServlet 'dispatcherServlet'
2024-07-26T19:51:46.074+08:00 WARN 400 --- [cTaskExecutor-1] io.lettuce.core.RedisChannelHandler : Connection is already closed
2024-07-26T19:51:46.075+08:00 ERROR 400 --- [cTaskExecutor-1] ageListenerContainer$LoggingErrorHandler : Unexpected error occurred in scheduled task
查看日志后,发现运行时,有个类路径发生变化了,然后有热部署插件,然后就会自动重启
然后我试着把热部署插件注释掉
<!--热部署-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- <scope>runtime</scope>-->
<!-- <optional>true</optional>-->
<!-- </dependency>-->
然后程序正常运行,插入数据库的操作也正常了。
目前已知的原因就是,类路径变化导致程序重启
但是为什么类路径变化还是不知道?
分析原因?
- 在使用异步操作的情况下,前边耗时时间不长,不会导致类路径变化,程序会正常的执行?