我有一个附加了EntityListener的托管实体。 PostUpdate和PostPersist上的EntityListener将实体添加到JMS队列以进行更多处理。所以这是场景,我有一个会话bean,它更新实体并合并更改,这反过来又触发了监听器上的PostUpdate。但是当MDB开始使用JMS消息时,它将实体从EntityManager中获取,但它获得的实体是该对象的旧值。这是我正在做的基本代码。
会话Bean方法
@Override public void updateEntity(Integer entityId, String name) { Entity entity = getEntity(entityId); entity.setName(name); em.merge(entity); }
听众方法
@PostPersist @PostUpdate public void afterUpsert(Entity entity) { this.entity = entity; JMSSubmitter submitter = getSubmitterBean(); submitter.submit(entity.getEntityId()); }
MDB代码
@Override public void onMessage(Message message) { TextMessage textMessage = (TextMessage) message; try { processMessage(textMessage); } catch (Exception ex) { logger.error("Unable to process the Entity message", ex); } } private void processMessage(TextMessage message) throws Exception { Integer entityId = new Integer(message.getText()); //Right here I am getting stale data. Entity entity = entityBean.getEntity(entityId); // ... //Some processing is done here // ... entity.setSomeOtherValue("blah"); entityBean.updateEntity(entity); }
所以我的问题是为什么我遇到这个问题,我认为这是一个交易问题。我认为我的初始更新事务在JMS开始使用消息之前没有提交。
答案 0 :(得分:0)
可能是您要么不使用JTA来协调JPA和JMS事务,要么就是这样,您将遇到两阶段提交竞争条件(请参阅:Delivery of JMS message before the transaction is committed)。