我有兩個無狀態的SessionBeans。 我的客戶端(JSF2應用程序)在第一個EJB(CompletionFacade)上調用方法(saveOrderCompletion),該方法調用第二個EJB(ContactFacade)上的另一個方法(processRequest)通過JMS向隊列發送消息。Jboss 7.1.1事務,級聯EJB方法
在第一個被調用的方法結束時,我拋出RuntimException來查看JBoss的行爲。這應該全部在一個事務中運行,因此事務應該執行回滾,以便不應該將消息發送到隊列。
我在weblogic服務器上檢查了這一點,它顯示了準確的行爲。 我的問題是爲什麼JBoss不回滾整個事務?我錯過了什麼......
實體沒有被持久化,但消息被髮送到隊列。
我使用JBoss 7.1.1,應用部署爲EAR
這裏是我的會話bean ...
/**
* Session Bean implementation class CompletionFacade
*/
@Stateless
public class CompletionFacade implements CompletionFacadeRemote, CompletionFacadeLocal {
@PersistenceContext(unitName="my_test")
private EntityManager entityManager;
@EJB
ContactFacadeLocal contactFacade;
.....
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public OrderCompletion saveOrderCompletion(OrderCompletion orderCompletion) throws TestBusinessException {
try {
...do some stuff on entity
//persist to get id
entityManager.persist(orderCompletion);
//finally send email
contactFacade.processRequest(orderCompletion,partner);
if (0 == 0)
throw new RuntimeException("Test RuntimeException ");
} catch (TestGenericException re) {
throw new TestBusinessException("Could not print orderCompletion: " ,re);
} catch (DocumentException e) {
throw new TestBusinessException("Could not print orderCompletion: " ,e);
}
return orderCompletion;
}
}
和第二立:
@Stateless
public class ContactFacade implements ContactFacadeRemote, ContactFacadeLocal {
....
/*
* actually create message
*/
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void processRequest(Object request, SmtpPartner partner) throws TestGenericException {
if (logger.isDebugEnabled()) {
logger.debug("Starting to process request!");
}
QueueConnection connection = null;
QueueSession session = null;
try {
...lookup queue etc...
sender.send(QUEUE, objectMessage);
} catch (JMSException e) {
logger.error("MS Exception:", e);
} catch (NamingException e) {
logger.error("Naming exception:", e);
} ...
} finally {
try {
session.close();
connection.close();
} catch (JMSException e) {
logger.error("Error closing connection:", e);
}
}
}
...
}
任何幫助非常感謝。
感謝您的回答。我相應地改變了注射'@Resource(mappedName =「java:/ JmsXA」)' 它現在可以工作了。非常感謝! – chrisF