【发布时间】:2010-12-31 01:25:21
【问题描述】:
问题来了
企业 Web 应用程序的用户正在执行一项任务,该任务会导致很长(非常长)的数据库查询(或其他长时间的处理密集型任务)
问题:
- 请求超时 - 一段时间后,用户可能会收到请求超时
- 会话超时 - 如果不使用会话保持方法,可能会发生会话超时
- 请求线程锁
- 由于请求线程没有返回,它可能会阻塞新的请求(如果达到池限制)
- 在某些应用服务器中,服务器的健康状态可能会触发节点或应用程序的强制重启(由于请求线程长时间运行)
- 如果用户离开页面:
- 交易未被取消 - 导致无用的处理没有人会从中受益
- 用户完成后无法返回查看结果
- 没有进度指示 - 用户只是等待页面刷新
我想出了几个解决方案,但我不确定我是否知道哪个更好(在所有方面,性能、最佳实践、优雅和可维护性),我想知道您推荐的解决方案是什么,并且如果有我错过的解决方案? (可能是的,而且很多)
糟糕的解决方案:将请求线程用作工作线程,在会话中保存进度状态,在另一个并行请求中通过 AJAX 调用检查状态(在会话中)
折衷解决方案:创建您自己的线程池,处理监控线程、工作线程并通过在分布式事务缓存或持久存储中同步状态来处理集群。这会释放请求,但会创建应用程序服务器不知道的线程,并且不会在取消部署时关闭。以干净的方式关闭线程取决于您,并且您总是有可能最终泄漏一些东西。这也不是 J2EE 的做法。
J2EE 解决方案:将 JMS 用于异步任务,这就是它的目的
Spring 解决方案:使用 Spring 批处理
你会在你的项目中做什么/做了什么?您还知道哪些其他解决方案?我上面提到的哪一个是您认为的赢家?
【问题讨论】:
标签: web-applications jakarta-ee