【问题标题】:504 Gateway timeout while generating excel file生成 excel 文件时出现 504 网关超时
【发布时间】:2016-03-19 16:25:24
【问题描述】:

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

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

该应用是带有 Oracle 数据库的 Spring Boot。我正在使用 POI 进行此导出。

【问题讨论】:

  • 你使用jasper生成报告吗?
  • 不,我正在使用 POI 库。
  • 我的意思是您使用哪种类型的模板?如果您使用 jasper 模板,那么您可以使用 JRFileVirtualizer 在 fileSystem 中写入数据块,最后您可以导出 excel 或 pdf。

标签: java spring oracle spring-boot


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我有同样的情况,网络调用的超时不在我们手中,所以我猜你有一些东西是 5 分钟接收第一个字节然后超时就消失了。

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

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

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

      在 Scala 中类似:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-20
        • 2020-03-21
        • 2019-12-02
        • 2011-08-30
        • 2017-04-30
        • 2019-08-30
        • 1970-01-01
        相关资源
        最近更新 更多