gpt4 book ai didi

Spring异步文件上传和处理

转载 作者:IT老高 更新时间:2023-10-28 13:48:53 25 4
gpt4 key购买 nike

我正在尝试上传文件然后读取它,一切正常,但当我将 @Async 注释放在处理程序方法上时却不行。

我不希望用户一直等到它处理完文件。但是在放置此注释后,我得到 java.lang.IllegalStateException: File has beenmoved - cannot be read again 异常。会发生什么,我该如何解决?据我了解,Spring 可能只是清除文件,因为请求响应结束并清理它。但是 @Async 不应该阻止这种情况吗?

示例 Spring Boot 应用程序:

@SpringBootApplication
@EnableSwagger2
@ComponentScan(value = "hello")
@EnableAsync
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex("/api/.*"))
.build();
}
}

上传 Controller :

@RestController
@RequestMapping(value = "/files")
public class FilesController {

@Inject
private Upload upload;

@RequestMapping(method = RequestMethod.POST)
public void addSource(@RequestParam MultipartFile file) throws IOException, InterruptedException {
upload.process(file);
}
}

上传服务:

@Component
public class Upload {

@Async
public void process(MultipartFile file) throws InterruptedException, IOException {
sleep(2000);
System.out.println(new String(IOUtils.readFully(file.getInputStream(), -1, false)));
}
}

现在我得到 java.io.FileNotFoundException。我不确定我在这里缺少什么。可能我做错了什么,因为我找不到任何错误,我认为这是非常常见的用例。

最佳答案

您不能以您的方式将 MultipartFile 参数交给您的 @Async 方法。

addSource 方法结束后,MultipartFile 超出范围,资源被释放。因此,您的“进程”方法内部的访问将失败。你以这种方式建立某种竞争条件。Springs DispatcherServlet 使用 StandardServletMultipartResolver.cleanupMultipart 来清理这些文件。在那里放置一个断点,以查看何时在重新调用 addSource(...) 时调用此方法。

您应该执行以下操作:将整个文件读入 addSource 方法内的 Buffer 中。然后将缓冲区传递给 process 方法并让 addSource 返回。

你所说的“...处理文件...”不是“处理”文件,而是读取它。

@Async
public void process(byte[] bs){
System.out.println(new String(bs));
//do some long running processing of bs here
}

@RequestMapping(method = RequestMethod.POST)
public void addSource(@RequestParam MultipartFile file) {
upload.process(IOUtils.toByteArray(file));
}

关于Spring异步文件上传和处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36565597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com