Hibernate 如何使用JPA编写生产者-消费者

Hibernate 如何使用JPA编写生产者-消费者,hibernate,jakarta-ee,jpa,producer-consumer,Hibernate,Jakarta Ee,Jpa,Producer Consumer,目前,我有一个JPA实体用于一种任务。一些进程写入该表,一个计划进程处理该任务,并在准备就绪时更改状态。我需要确定任务的优先级,如果任务失败,我需要降低重试频率。我的环境是GlassFish3+JPA,通过Hibernate+MySQL+XA事务。在中期内,该项目将用Spring解决方案(使用Jetty等)取代GlassFish 它以某种方式实现了这一点,但我对此并不满意:我得到了乐观的锁例外,看起来我在某些时候没有正确处理事务,如果你需要可变时间,GlassFish上的JPA计时器也有点混乱

目前,我有一个JPA实体用于一种任务。一些进程写入该表,一个计划进程处理该任务,并在准备就绪时更改状态。我需要确定任务的优先级,如果任务失败,我需要降低重试频率。我的环境是GlassFish3+JPA,通过Hibernate+MySQL+XA事务。在中期内,该项目将用Spring解决方案(使用Jetty等)取代GlassFish

它以某种方式实现了这一点,但我对此并不满意:我得到了乐观的锁例外,看起来我在某些时候没有正确处理事务,如果你需要可变时间,GlassFish上的JPA计时器也有点混乱

我觉得我在这里使用了错误的工具,我应该使用一些成熟、稳定的设计,而不是混为一谈的东西。使用JPA实体似乎很重要,但原始JDBC看起来更糟糕。当然,我希望避免严重的库依赖性,但可能我忽略了针对我的特定问题的简单“固定”解决方案(这似乎并不罕见)

[编辑]


为了澄清:我不会更改用例(我甚至没有代码了),我只想得到一些一般性的指导方针,以便下次“正确操作”(TM)。回答ben75的问题:工作人员可能是多线程的,我需要小事务,因为它应该一直运行—可能会持续几个月。

我认为您只需要尝试从上面看问题,以确定流程中的角色并检测任务创建者和处理器之间的依赖关系任务和优先级控制器的名称。之后,为每个角色设计干净的可重用EJB/服务

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

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

处理任务时:我将获取带有悲观锁的任务实体,以便其他线程不会开始处理同一任务


因此,我认为您的流程很复杂,需要更好/更灵活的设计。

您的辅助进程是单线程的吗?谁确定优先级(工人、生产者或?你什么时候(在任务执行结束时或…)获得这些乐观锁定?在整个任务执行过程中,您是否只有一个事务?这些都是好主意,例如,我从未尝试过
@Asynchronous