在 Java Spring 的 REST 方法中返回后执行清理操作

Posted

技术标签:

【中文标题】在 Java Spring 的 REST 方法中返回后执行清理操作【英文标题】:Perform cleanup action after return in REST method in Java Spring 【发布时间】:2018-07-12 03:26:39 【问题描述】:

我想在创建 zip 文件后清理文件。其中一项操作是删除 zip 文件本身。

    @RequestMapping(path = "/downloadZip", method = RequestMethod.GET)
public ResponseEntity<Resource> download(String fileName) throws IOException 

//Create a zip file and add entries

    Path path = Paths.get(file.getAbsolutePath());
    ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(path));

    return ResponseEntity.ok()
            .headers(headers)
            .contentLength(file.length())
            .contentType(MediaType.parseMediaType("application/octet-stream"))
            .body(resource);

//Call a cleanup method
//cleanUp();


在 Junit 测试中,我能够使用静态方法 AfterClass 删除 zip 文件。

问题:如何定义返回后获取的方法。

谢谢!

【问题讨论】:

对资源使用 try:***.com/questions/17650970/… 将方法的内容包装在try / finally 块中,并在finally 块中进行清理。此外,您不应该将整个文件读入内存,而是直接将其从文件系统流式传输到客户端,这将为您节省大量内存。 我能够在 finally 块中定义清理,我将在未来的迭代中按照@Snickers3192 的建议研究 AspectJ。缓冲区不起作用的原因是,我们正在编辑很多文件 ~ 200 MB,然后进行更改,例如将文件转换为 PDF,更改文件名。谢谢! 【参考方案1】:

首先我建议你有一个不需要写文件的无状态网络应用程序。只需使用缓冲区即可。尤其是当你说你必须在之后清理文件时。

但是,如果您无法摆脱这种情况,并且在将某些内容返回给用户后仍想执行任务,那么您有几个选择。您可以使用非常安静的 Aspect,以便查看 AspectJ。否则,您还可以查看在 Controller 方法上结合使用 Futures@Async 注释。

使用 cmets 中建议的资源语法会阻止您的方法返回客户端的调用,您可能会很好,并且您必须确保处理异常,发生某些错误时不会清理文件。 IMO 使用这种方法后您会有些头疼,例如您的文件系统被填满。

【讨论】:

以上是关于在 Java Spring 的 REST 方法中返回后执行清理操作的主要内容,如果未能解决你的问题,请参考以下文章

使用邮递员的 PUT/PATCH 请求在 Laravel 中返​​回状态码 0

如何在 Laravel 中返​​回数据库表名

无法使用 Spring 使用 java REST Api 接收 json 数据

反序列化时的Spring Java Rest Handle无效类型

Spring Boot Rest控制器单元测试

Java Spring REST 控制器异常