java - 如何以编程方式覆盖方法或 bean 的 Glassfish 超时配置?

标签 java nginx glassfish java-ee-7

我有一个专门用于导出 CSV 的 Bean,由于数据量很大,大约需要 15 分钟或更长时间,并且超时。

为了解决这个问题,我考虑只为这个 bean 添加某种配置,因为我不能增加 Glassfish 超时。因此,在我的本地计算机中,我更改了 Glassfish 超时配置以进行一些测试并减少这 15 分钟(来自网络监听器的请求超时和来自线程池的 IDLE 超时),并且通过仅添加 @Transactional 注释,它可以工作,但当我使用预生产计算机时,它没有。

两者都是 Glassfish 4.1.1,但在预生产中我也使用 Nginx。但尝试通过 8181 端口(HTTPS,我的 Nginx 无法控制)也不起作用。

所以我一直在尝试不同的解决方案:

  • @Transactional(因为 Glassfish 中事务超时为 0)
  • 使用 EJB
  • @StatefulTimeout
  • @TransactionManagement(TransactionManagementType.CONTAINER) 和 @TransactionAttribute(TransactionAttributeType.REQUIRED)

这些在预制作中都不起作用。有人可以指导我一下吗?

编辑: 这是我的 Nginx 配置。

server {
    listen       80;
    client_max_body_size 900M;
    server_name *my config*;
    location / {
        proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_buffering off;
            proxy_ignore_client_abort off;
            proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8080;
    }
}

问题是,即使在 Glassfish 中设置超时并将其减少到 1 分钟,在预生产中我也无法避免超时,连接会在那分钟后关闭。

最佳答案

对于在线应用程序来说,长事务通常不是一个好主意。考虑到这一点,将连接超时限制为 1 分钟可能是有意义的。

您可以做的是在后台异步执行实际的 CSV 导出。通过使用@Async注释无状态 session bean的业务方法,该方法将在单独的线程中执行,而原始请求立即完成。事务超时 @Async当然,需要增加带注释的方法,但您可能已经这样做了。由于初始请求立即结束,因此超时不再是问题。并且导出是在服务器后台执行的,无需连接到客户端。

注意:用@Async注释的业务方法默认情况下在新事务中启动。

剩下的问题是,如果需要的话,正确地向用户报告 CSV 导出的结果。在初始请求之后,只能告诉用户 CSV 导出作业已被触发,但不能告诉用户是否成功完成。一种可能的解决方案是,长时间运行的导出方法返回 FutureResult<ExportJobResult> ,注册于 @Singleton由工作 ID 键入。生成的作业 ID(例如 UUID)与初始响应一起返回给客户端。然后,客户端可以轮询(假设每 10 秒一次)Future 的状态。对象(检查 isDone() )。更详细的解决方案是一个完整的作业管理框架,它可以保留作业状态。

关于java - 如何以编程方式覆盖方法或 bean 的 Glassfish 超时配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35579655/

相关文章:

java - Gson - 将任何空值序列化为空字符串

java - 如何使用 JPA @Query 注释定义自定义查询

apache - 需要帮助将 Apache2 重写规则转换为 nginx

java - 如何解决 glassfish 上的 Web 服务应用程序中的 "HTTP Status 500 - Internal Server Error"问题?

JavaMelody - 在 GlassFish v3+ 中监控 sql 请求和 jdbc 连接

java - Android:Java:不使用 GSON 或 jackson 进行 JSON 解析

java - 从 json 推文中获取 json 用户

Nginx:响应处理和带缓存的反向代理

mysql - 您如何检测导致 Passenger 应用程序实例不断消耗越来越多内存的问题?

java - 使用 Eclipse 部署和测试 rest-webservice