504生成excell文件时网关超时

时间:2015-12-14 08:50:13

标签: java spring oracle spring-boot

我试图对一些数据量进行excell导出。 5分钟后,在浏览器中我获得了504网关超时,在后端,该过程继续其工作。要完成整个服务,我需要大约15分钟。有什么办法可以防止这种情况发生吗?我无法访问生产中的服务器。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在同样的情况下,网络呼叫的超时不在我们手中,所以我猜您有5分钟的时间接收第一个字节,然后超时消失了。

我的解决方案是,假设您有一个 controller 和一个 query 层来与数据库对话。在这种情况下,您可以通过异步方式进行处理。对该控制器的调用应仅触发该异步执行并立即返回成功状态,而无需等待。在这里执行将在后台发生。期货可以在这里使用,因为它们是异步的,一旦使用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)

并在Scala中像这样:

 val result = Future {
    exportData(data)
 }

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