Java 504生成excel文件时网关超时

Java 504生成excel文件时网关超时,java,spring,oracle,spring-boot,Java,Spring,Oracle,Spring Boot,我正在尝试为一些数据量实现excel导出。5分钟后,我收到504网关超时。在后端,流程将继续其工作 要完成整个服务,我需要大约15分钟。我能做些什么来防止这种情况?我无法访问生产中的服务器 该应用程序是使用Oracle数据库的Spring boot。我正在使用POI进行此导出。您可以以较小的块导出数据。使用10K记录运行测试,记下最后一条记录的id,并从下一条记录开始重复导出。如果10公里跑得很快,那么试试50公里。如果你有一个计时器,可能会派上用场。祝你好运。处理这类问题的一种常见方法是让第一

我正在尝试为一些数据量实现excel导出。5分钟后,我收到504网关超时。在后端,流程将继续其工作

要完成整个服务,我需要大约15分钟。我能做些什么来防止这种情况?我无法访问生产中的服务器


该应用程序是使用Oracle数据库的Spring boot。我正在使用POI进行此导出。

您可以以较小的块导出数据。使用10K记录运行测试,记下最后一条记录的id,并从下一条记录开始重复导出。如果10公里跑得很快,那么试试50公里。如果你有一个计时器,可能会派上用场。祝你好运。

处理这类问题的一种常见方法是让第一个请求在后台启动流程,生成文件后,从其他地方下载结果。第一个请求立即完成,然后用户可以检查另一个视图以查看文件是否已生成,并下载结果。

我也遇到过同样的情况,网络呼叫超时不在我们手中,因此我猜您可能需要5分钟才能收到第一个字节,然后超时就消失了

我的解决方案是,假设您有一个控制器和一个查询层与数据库对话。在这种情况下,您将以异步方式创建流程。对该控制器的调用应该只触发异步执行,并立即返回成功状态,而无需等待。在这里,执行将在后台进行。这里可以使用Future,因为它们是异步的,并且您还可以使用Future的回调方法处理完成后的结果

您可以在java8中使用Future和callback方法实现,如下所示:

Futures.addCallback(
  exportData,
  new FutureCallback<String>() {
    public void onSuccess(String message) {
      System.out.println(message);
    }
    public void onFailure(Throwable thrown) {
      thrown.getCause();
    }
  }, 
service)

您是否使用jasper生成报告?不,我使用的是POI库。我的意思是您使用哪种类型的模板?如果您使用jasper模板,那么您可以使用JRFileVirtualizer在文件系统中编写数据块,最后您可以导出excel或pdf。
 val result = Future {
    exportData(data)
 }

 result.onComplete {
    case Success(message) => println(s"Got the callback result:  
    $message")
    case Failure(e) => e.printStackTrace
 }