Wicket:如何处理长时间运行的任务

6
我已经设置了一个Wicket + Hibernate + Spring Web应用程序,涉及收集一些数据(生成并返回一些文件),将其存储在数据库中,创建一些图像并在网页上显示所有这些内容。
这对于短时间运行都很好,但有时收集数据(包括一些远程计算)需要太长时间(20分钟以上)并超时。 我尝试使用两种方法解决此问题,但两种方法都存在一些问题。
第一种方法是使用 AjaxLazyLoadPanel,并在getLazyLoadComponent中完成所有操作。 这对于短时间运行很好,但对于20分钟以上的运行,由于超时,LazyLoadComponents无法加载。
第二种方法是创建一个中间Fragment,并添加一个持续时间为10秒的AjaxSelfUpdatingTimerBehavior,以轮询进行数字处理中创建的文件。这似乎使任务在后台运行没有问题,但当返回的数据需要存储在数据库中时会失败。我正在使用Open Session in View模式,但也许在20分钟后尝试存储数据时会失败吗??(解决方案可能在于解决这个问题..)。
由于以上问题,我现在正在阅读备选方法来处理这些长时间运行的任务,并遇到了以下内容:

我现在想知道这两种方法是否更适合解决我在运行任务和将数据存储到数据库中遇到的超时问题,或者是否有其他解决方案可以帮助我解决这个问题。

在我再次实施可能最终不起作用的东西之前,我真的很想知道新方法是否可行。

最好的问候,
Tim

1个回答

3

我知道我们成功地使用了带有AjaxSelfUpdatingTimerBehavior的Panel。任务和结果部分与视图逻辑分离,但通过您创建的服务可以访问它们。我们使用的服务实现负责启动TheadPool或ExectutorService来运行各个任务。该服务可以提供一种监视正在进行的特定作业/调用的进度/状态的方法。一旦完成,它还应该使数据对视图可用。将SessionFactory注入到服务实现中(或注入DAO)应足以在WebSession之外创建HibernateSession。


谢谢,发完问题后我也想到了这个(提出问题的方式就像橡皮鸭一样)。我还需要找出这是否真正解决了问题,因为日志没有记录任何超时会话的信息...只有数据库中结果的缺失是显而易见的。如果我有更多发现,我会更新的。 - Tim
1
最终采用了这种方法,自那以后就没有遇到任何问题。谢谢! - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接