2012-06-01 59 views
4

我有兩個無狀態的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); 
      } 

     } 
    } 

... 
} 

任何幫助非常感謝。

回答

3

你已經離開了最重要的部分;從中獲得連接的JMS連接工廠以及如何獲得此工廠的方式。

確保你注入了這個工廠,並且你使用了一個事務性工廠。在JBoss AS 6中,java:/ JmsXA是事務性的,java:/ ConnectionFactory是非託管/非事務性的替代方案。檢查AS 7是否使用正確的。

+0

感謝您的回答。我相應地改變了注射'@Resource(mappedName =「java:/ JmsXA」)' 它現在可以工作了。非常感謝! – chrisF