【问题标题】:How to write a producer-consumer using JPA如何使用 JPA 编写生产者-消费者
【发布时间】:2013-06-18 07:26:19
【问题描述】:

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

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

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

[编辑]

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

【问题讨论】:

  • 你的工作进程是单线程的吗?谁确定优先级(工人或生产者或......)?你什么时候得到那些 OptimisticLocking(在任务执行结束时或......)?在任务的整个执行过程中,您是否只有一个事务?

标签: hibernate jakarta-ee jpa producer-consumer


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这些已经是一些不错的想法了,例如我从未尝试过@Asynchronous
猜你喜欢
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多