我使用Spring MVC 3 + Tiles作为webapp。我的操作很慢,我喜欢请等待页面。
有两种主要方法可以等待页面,我知道:
(1)很好,因为它保持了所有单线程的操作,但是Tiles看起来不可能,因为每个JSP必须在页面组装并返回给客户端之前完整地完成呈现。
所以我开始实施(2)。在我的实现中,第一个请求使用Spring的@Async
注释在后台线程上开始操作,该注释返回Future<Result>
。然后返回&#34;请等待&#34;页面给用户,每隔几秒刷新一次。
当刷新请等待页面时,控制器需要检查后台线程的进度。这样做的最佳方式是什么?
Future
对象直接放在Session中,那么轮询请求线程可以将其拉出并检查线程的进度。但是,这并不意味着我的会话不可序列化,因此我的应用程序无法部署多个Web服务器(不需要粘性会话)?答案 0 :(得分:1)
Spring MVC部分问题相当简单,因为问题与Spring MVC无关。请参阅此答案中的可能解决方案:https://stackoverflow.com/a/4427922/734687
正如您在代码中看到的那样,作者使用tokenService来存储未来。实现不包括在内,这里的问题就像您已经知道的那样,在您想要进行故障转移时开始。
解决方案不是为了保存未来,而是为了工作的状态(在工作中,完成后,结果失败)。即使查询会话和执行线程在不同的机器上,状态也应该是可访问的并且可以序列化。但是你会怎么做?这可以通过将其存储在数据库或文件系统(上面的示例,您可以检查zip文件是否可用)或键/值存储或缓存或公共对象存储(Terracota)中来实现, ...
实际上,每个批处理框架(例如Spring Batch)都以这种方式工作。它将作业的当前状态存储在数据库中。您担心将域数据与操作数据混合在一起。但是大多数应用程在大型应用程序上,可以使用两个数据库实例,操作数据和域数据。
所以我建议您将工作的状态和结果保存在数据库中 希望有所帮助。