我有一个托管实体,它附加了一个EntityListener . PostUpdate和PostPersist上的EntityListener将实体添加到JMS队列以进行更多处理 . 所以这是场景,我有一个会话bean,它更新实体并合并更改,然后在监听器上触发PostUpdate . 但是当MDB开始使用JMS消息时,它将实体从EntityManager中获取,但它获得的实体是该对象的旧值 . 这是我正在做的基本代码 .
Session Bean Method
@Override
public void updateEntity(Integer entityId, String name) {
Entity entity = getEntity(entityId);
entity.setName(name);
em.merge(entity);
}
Listener Method
@PostPersist
@PostUpdate
public void afterUpsert(Entity entity) {
this.entity = entity;
JMSSubmitter submitter = getSubmitterBean();
submitter.submit(entity.getEntityId());
}
MDB Code
@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开始使用消息之前没有提交 .
1 回答
可能是您要么不使用JTA来协调JPA和JMS事务,要么就是这样,您将遇到两阶段提交竞争条件(请参阅:Delivery of JMS message before the transaction is committed) .