目前,我有一种JPA实体用于某种任务。有些进程会写入该表,并且计划的进程将对该任务起作用,并在准备就绪时更改状态。我需要确定任务的优先顺序,并在失败时以降低的频率重试它们。我的环境是通过Hibernate + MySQL + XA事务的GlassFish 3 + JPA。在中期内,该项目将通过Spring解决方案(使用Jetty等)取代GlassFish。如何使用JPA编写生产者 - 消费者
它以某种方式得到了这个工作,但我对它并不满意:我得到了OptimisticLockExceptions,看起来我没有在某些点上获得正确的事务,而且GlassFish上的JPA计时器也有点混乱你需要可变的时间。
我有这种感觉,我在这里使用了错误的工具,而且我应该使用一些成熟稳定的设计,而不是一起杵在一起。使用JPA实体似乎是沉重的,但原始JDBC看起来更糟糕的选择。当然,我想避免沉重的图书馆依赖性,但也许我忽略了针对特定问题的简单“罐装”解决方案(这看起来并不常见)。
[编辑]
为了澄清:我不会改变用途的情况下(我甚至不具备的代码了),我只是想获得一些一般原则,以“做正确“(TM)下一次。为了回答ben75提出的问题:工作人员可能是多线程的,而且我需要小型交易,因为它应该一直运行 - 也许几个月。
你的工作进程是单线程吗?谁确定优先级(工人或生产者或...)?你什么时候获得OptimisticLocking(在任务执行结束时或...)?在整个任务执行期间你有单一交易吗? – ben75