JMS Message получает устаревшие данные из Hibernate - PullRequest
1 голос
/ 03 ноября 2010

У меня есть управляемый объект, к которому прикреплен EntityListener. EntityListener в PostUpdate и PostPersist добавляет объект в очередь JMS, чтобы выполнить дополнительную обработку. Итак, вот сценарий, у меня есть сессионный компонент, который обновляет сущность и объединяет изменения, которые, в свою очередь, запускают PostUpdate на слушателе. Но в тот момент, когда MDB начинает потреблять JMS-сообщение, он получает Entity из EntityManager, но Entity, который он получает, является старыми значениями для этого объекта. Вот основной код того, что я делаю.

Метод сессионного компонента

@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 голосов
/ 17 июня 2014

Возможно, вы либо не используете JTA для координации транзакций JPA и JMS, либо, если это так, вы сталкиваетесь с условием двухфазной фиксации (см .: Доставка сообщения JMS до транзакции).совершено ).

...