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

标签 java hibernate timeout wicket

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

这一切都适用于短期运行,但有时收集数据(涉及一些远程数字运算)会花费太长时间(20 分钟以上)并超时。我尝试使用两种方法解决此问题,但它们都显示出一些问题。

第一种方法是使用 AjaxLazyLoadPanel s 并在 getLazyLoadComponent 中执行所有操作。这对于短时间运行效果很好,但对于 20 分钟以上的运行,LazyLoadComponents 将由于超时而无法加载(这里很矛盾)。

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

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

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

我真的很想知道新方法是否可行,然后再花一天时间实现一些最终可能行不通的方法。

最好的问候,
蒂姆

最佳答案

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

关于java - Wicket:如何处理长时间运行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2310421/

相关文章:

java - 构建器模式用于构造可以具有不同类型的类的实例

java - xPage ManagedBean ODA 应用程序错误

java - 当使用 FlushMode.AUTO 调用 session.close() 时,Hibernate 会刷新我更新的持久对象吗?

node.js - 避免使用 cy.wait() 等待页面由于中止的获取请求而加载 cypress

java - 有效地替换字符串中所有不受支持的字符

java - 在方法调用期间将数组作为参数传递时出现 IllegalArgumentException

java - CDI 注入(inject)和 JPA EntityManager

mysql - 我可以使用 Hibenrate hbm2ddl 在同一个数据库中创建 MyISAM 和 InnoDB 表吗

java - 是否可以从超时的 InputStream 中读取?

java - 如何保持 jdbc 到 postgres 的存活