У меня есть управляемый объект, к которому прикреплен 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 начнет использовать сообщение.