4

目前我有一个 JPA 实体来执行某种任务。一些进程写入该表,调度进程处理该任务,并在准备好时更改状态。我需要确定任务的优先级,并在它们失败时以递减的频率重试它们。我的环境是 GlassFish 3 + JPA 通过 Hibernate + MySQL + XA 事务。从中期来看,该项目将用 Spring 解决方案(使用 Jetty 左右)取代 GlassFish。

它以某种方式使其工作,但我对此并不满意:我得到 OptimisticLockExceptions,看起来我在某些时候没有正确处理事务,如果您需要可变时间,GlassFish 上的 JPA 计时器也有点混乱.

我觉得我在这里使用了错误的工具,我应该使用一些成熟、稳定的设计,而不是一起使用的东西。使用 JPA 实体似乎是重量级的,但原始 JDBC 看起来是一个更糟糕的选择。当然,我想避免严重的库依赖,但也许我忽略了针对我的特定问题的简单“罐装”解决方案(这似乎并不罕见)。

[编辑]

为了澄清:我不会更改用例(我什至没有代码了),我只是想获得一些通用指南,以便下次“做对”(TM)。回答 ben75 的问题:worker 可能是多线程的,我需要小事务,因为它应该一直运行 - 可能几个月。

4

1 回答 1

1

我认为您只需要尝试从上面查看事物,以识别流程中的角色并检测任务创建者、任务处理器和优先级控制器之间的依赖关系。之后,为这些角色中的每一个设计清洁可重用的 EJB/服务。

有时,对于只需要 10-20 秒的相对较短的任务,使用异步 EJB(搜索@Asynchronous)而不是创建任务来强制用户等待更有意义。

关于 OptimisticLockExpcetions:这些可能是因为数据同时更改而发生的,这可能是由任务消费者的其他线程之一或更改数据的客户端引起的。确定原因,如果是第一种情况,请纠正错误。当然,如果您提供一些有关一切如何工作的代码或解释,您将获得更多帮助。

处理任务时:我会使用悲观锁获取任务实体,这样另一个线程就不会开始处理相同的任务。

所以我想你的过程很复杂,你需要一个更好/更灵活的设计。

于 2013-09-16T16:25:37.450 回答