系统如何处理异常?
我们会自定义一个统一的异常处理器去捕获并处理异常。
使用控制器增强注解@ControllerAdvice和异常处理注解@ExceptionHandler来实现。
(1)处理自定义异常程序
在编写代码时根据校验结果主动抛出自定义异常类对象,抛出异常时指定详细的异常信息,异常处理器捕获异常信息记录异常日志并响应给用户。
(2)处理未知异常
接口执行过程中的一些运行时异常也会由异常处理器统一捕获,记录异常日志,统一响应给用户500错误。在异常处理器中还可以针对某个异常类型进行单独处理。
请求参数的合法性校验如何做?
使用基于JSR303的校验框架实现,SpringBoot提供了ISR-303的支持,它就是spring-boot-starter-validation,它包括了很多校验规则,只需要在模型类中通过注解指定校验规则,在controller方法上开启校验。
什么情况下Spring事物会失效
(1)在方法中捕获异常没有抛出去
(2)非事务方法调用事务方法
(3)事务方法内部调用事务方法
(4)@Transactional标记的方法不是public
(5)抛出的异常与rollbackFor指定的异常不匹配,默认rollbackFor指定的异常为RuntimeException
(6)数据库表不支持事务,比如MySQL的MyISAM
(7)Spring的传播行为导致事务失效,比如: PROPAGATION_NEVER、PROPAGATION_NOT_SUPPORTED
断点续传是怎么做的?|
我们是基于分块上传的模式实现断点续传的需求,当文件上传一部分断网后前边已经上传过的不再上传。
(1)前端对文件分块。
(2)前端使用多线程一块一块上传,上传前给服务端发一个消息校验该分块是否上传,如果已上传则不再上传。
(3)等所有分块上传完毕,服务端合并所有分块,校验文件的完整性。
因为分块全部上传到了服务器,服务器将所有分块按顺序进行合并,就是写每个分块文件内容按顺序依次写入一个文件中。使用字节流去读写文件。
(4)前端给服务传了一个md5值,服务端合并文件后计算合并后文件的md5是否和前端传的一样,如果一样则说文件完整,如果不一样说明可能由于网络丢包导致文件不完整,这时上传失败需要重新上传。
分块文件清理问题?
上传一个文件进行分块上传,上传一半不传了,之前上传到minio的分块文件要清理吗?怎么做的?
1.在数据库中有一张文件表记录minio中存储的文件信息。
2.文件开始上传时会写入文件表,状态为上传中,上传完成会更新状态为上传完成。
3.当一个文件传了一半不再上传了说明该文件没有上传完成,会有定时任务去查询文件表中的记录,如果文件未上传完成则删除minio中没有上传成功的文件目录。