JMS Message正在从Hibernate获取过时的数据

时间:2010-11-03 16:43:38

标签: jpa transactions persistence jms listener

我有一个附加了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开始使用消息之前没有提交。

1 个答案:

答案 0 :(得分:0)

可能是您要么不使用JTA来协调JPA和JMS事务,要么就是这样,您将遇到两阶段提交竞争条件(请参阅:Delivery of JMS message before the transaction is committed)。