我有一個onMessage方法,我從隊列中接收一個ObjectMessage並使用該信息來填充和保存一個JPA實體對象。但是當持久化實體對象出現問題時,它將重新執行onMessage()。我的猜測是它將ObjectMessage推回隊列,因此onmessage再次被執行。這樣我就進入了一個無限循環。如何停止onMessage()再次執行或控制執行次數。這是我的代碼。 saveAuditData(auditInfo)發生錯誤。如何在MDB中停止回滾?
public void onMessage(Message inMessage) {
log.debug("Entering onMessage() Method.");
AuditInfo auditInfo = null;
try {
ObjectMessage om = (ObjectMessage) inMessage;
auditInfo = (AuditInfo) om.getObject();
log.debug("Message received : " + auditInfo.getApiUsed());
log.debug("Calling saveAuditData().");
saveAuditData(auditInfo);
log.debug("Leaving onMessage() Method.");
}
catch (Exception e) {
e.printStackTrace();
log.debug("Error persisting Audit Info.",e);
log.debug("Printing Audit Info:");
log.debug(auditInfo.toString());
}
}
private void saveAuditData(AuditInfo auditInfo) {
log.debug("Entering saveAuditData() Method.");
log.debug("Populating Audit Object.");
IdmAudit idmAudit = new IdmAudit();
idmAudit.setApiUsed("API");
idmAudit.setAppClientIpAddress("localhost");
idmAudit.setAuditActivity("activity1");
idmAudit.setAuditData(auditInfo.getAuditData());
idmAudit.setAuditGroup(AUDIT_GROUP);
idmAudit.setAuditType("Type");
idmAudit.setIdmAuditCreationDate(new Date());
idmAudit.setLocationCd("Location");
idmAudit.setPurgeDate(null);
idmAudit.setSubscriberId(new BigDecimal(0));
idmAudit.setSuccessInd("Y");
idmAudit.setUserId(new BigDecimal(0));
idmAudit.setAuditSource("Source");
idmAudit.setVersionNumber(new BigDecimal(0));
log.debug("Saving Audit.");
entityManager.persist(idmAudit);
entityManager.flush();
log.debug("Leaving saveAuditData() Method.");
}
嗨Acasolla。當你試圖告訴我得到這個消息:在該行 多個標記 \t - 實現javax.jms.MessageListener.onMessage \t - JSR 345:EJB 3.2,8.37:本REQUIRES_NEW事務屬性類型值是無效的消息驅動的bean消息偵聽器方法。指定REQUIRED或 \t NOT_SUPPORTED值。 我認爲這是行不通的。 – 2017-08-02 22:25:50