异步操作与热部署踩坑

异步操作中数据库插入失败,但是代码时没有问题的

单步调试的状态下,程序可以正确执行

上代码

        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>-->

然后程序正常运行,插入数据库的操作也正常了。

目前已知的原因就是,类路径变化导致程序重启

但是为什么类路径变化还是不知道?

分析原因?

  • 在使用异步操作的情况下,前边耗时时间不长,不会导致类路径变化,程序会正常的执行?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值