2010-11-03 79 views
1

我有一個託管實體,它附有一個EntityListener。 PostUpdate和PostPersist上的EntityListener將該實體添加到JMS隊列以進行更多處理。所以這裏是場景,我有一個會話bean,它會更新實體併合並更改,從而觸發監聽器上的PostUpdate。但是,當MDB開始使用JMS消息時,它會從EntityManager中獲取實體,但它所獲得的實體是該對象的舊值。這是我正在做的基本代碼。JMS消息正在從休眠獲取陳舊的數據

會話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); 

} 

所以我的問題 - [R最後是爲什麼我有這個問題,我認爲這是一個交易問題。我認爲我的初始更新事務在JMS開始使用消息之前尚未提交。

回答