2010-11-03 23 views
1

J'ai une entité gérée avec un EntityListener attaché. EntityListener sur PostUpdate et PostPersist ajoute l'entité à une file d'attente JMS pour effectuer un traitement supplémentaire. Donc, voici le scénario, j'ai un bean session qui met à jour l'entité et fusionne les changements, ce qui déclenche à son tour le PostUpdate sur l'auditeur. Mais à ce moment-là, lorsque la MDB commence à consommer le message JMS, elle obtient l'Entity hors de l'EntityManager mais l'Entité qu'elle reçoit est l'ancienne valeur de cet objet. Voici le code de base de ce que je fais.Le message JMS reçoit des données périmées d'Hibernate

Session Bean Méthode

 
@Override 
public void updateEntity(Integer entityId, String name) { 
    Entity entity = getEntity(entityId); 
    entity.setName(name); 
    em.merge(entity); 
} 

Listener Méthode

 
@PostPersist 
@PostUpdate 
public void afterUpsert(Entity entity) { 
    this.entity = entity; 
    JMSSubmitter submitter = getSubmitterBean(); 
    submitter.submit(entity.getEntityId()); 
} 

code 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); 

} 

Ma question r eally est pourquoi j'ai ce problème, je pense que c'est un problème de transaction. Je pense que ma transaction de mise à jour initiale n'a pas été validée avant que le JMS commence à consommer le message.

Répondre