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

时间:2010-02-22 11:05:07

标签: java hibernate timeout wicket

我设置了一个Wicket + Hibernate + Spring Web应用程序,它涉及收集一些数据(生成和返回一些文件),将其存储在数据库中,创建一些图像并在网页上显示所有这些。

这一切都适用于短期运行,但有时收集数据(涉及一些远程数字运算)需要太长时间(20多分钟)并且超时。我试图用两种方法来解决这个问题,但是它们都显示出一些问题。

第一种方法是使用AjaxLazyLoadPanel并只执行getLazyLoadComponent中的所有操作。这在短期运行中运行良好,但是对于20多分钟的运行,由于超时,LazyLoadComponents将无法加载(在那里有好的矛盾)。

第二种方法涉及创建一个中间片段,其中添加AjaxSelfUpdatingTimerBehavior,持续时间设置为10秒,轮询在数字运算中创建的文件。这似乎使任务在后台运行没有问题,但是当返回的数据需要存储在数据库中时失败。我在View模式中使用Open Session,但是在20分钟后尝试存储数据时可能会失败? (解决方案可能在于解决这个问题......)。

由于上述问题,我现在正在阅读处理这些长期运行任务的替代方法,并且遇到了:

我现在想知道这些中的任何一个是否更适合解决我在运行任务和之后将数据存储在数据库中的超时问题,或者是否有任何其他解决方案可能在这种情况下提供帮助。

我真的想知道,在我花一天时间实施一些可能最终无法发挥作用的方法之前,新方法是否可行。

最好的问候,

1 个答案:

答案 0 :(得分:3)

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