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開始使用消息之前尚未提交。