请求结束后如何删除文件?Quarkus RESTEasy Reactive替代方案咨询
Quarkus Resteasy Reactive 中请求结束后清理临时文件的方案
在Quarkus搭配resteasy-reactive扩展时,有两种实用方案可以替代RestEasy的Cleanables机制,实现请求结束后自动删除临时文件:
1. 请求作用域Bean结合@PreDestroy注解
创建一个请求作用域的Bean来管理临时文件,利用@PreDestroy注解在请求生命周期结束时触发清理操作:
import jakarta.enterprise.context.RequestScoped; import jakarta.annotation.PreDestroy; import java.io.File; import java.util.ArrayList; import java.util.List; @RequestScoped public class TempFileCleaner { private final List<File> tempFiles = new ArrayList<>(); public void addTempFile(File file) { tempFiles.add(file); } @PreDestroy void cleanup() { for (File file : tempFiles) { if (file.exists()) { file.delete(); } } } }
在REST资源类中注入这个Bean,将需要清理的临时文件添加进去即可:
import jakarta.inject.Inject; import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; import java.io.File; import java.io.IOException; @Path("/upload") public class UploadResource { @Inject TempFileCleaner tempFileCleaner; @POST public String handleUpload() throws IOException { File tempFile = File.createTempFile("upload-", ".tmp"); // 执行文件处理逻辑 tempFileCleaner.addTempFile(tempFile); return "处理完成"; } }
2. 利用请求上下文添加清理任务
通过Quarkus的QuarkusResteasyReactiveRequestContext直接向请求上下文注册清理任务,请求结束时会自动执行所有注册的任务,逻辑和原Cleanables机制高度一致:
import io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext; import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Context; import java.io.File; import java.io.IOException; @Path("/process") public class ProcessResource { @POST public String processFile(@Context QuarkusResteasyReactiveRequestContext requestContext) throws IOException { File tempFile = File.createTempFile("process-", ".tmp"); // 执行文件处理逻辑 requestContext.addCleanupTask(() -> { if (tempFile.exists()) { tempFile.delete(); } }); return "处理完成"; } }
内容的提问来源于stack exchange,提问作者Piu130
相关产品推荐
相关产品推荐

