2017-02-01 13 views
1

新しいトランザクションでRuntimeExceptionがスローされた場合、なぜロールバックが起こらないのか理解できませんでした。RuntimeExceptionがロールバックされない

マイMDB:

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
    @MessageDriven(activationConfig = { 
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/adwordsReportRequest"), 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
    @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "veiculo = 'teste'"), 
    @ActivationConfigProperty(propertyName = "transactionTimeout", propertyValue = "10"),}) 
public class TesteMDB implements MessageListener { 

@Resource 
private MessageDrivenContext mdc; 

@Inject 
private ReportExtractor reportExtractor; 

@Inject 
private Logger logger; 

public TesteMDB() { 
    // TODO Auto-generated constructor stub 
} 

public void onMessage(Message inMessage) { 

    try { 
     runReport(); 

    } catch (Exception e) { 
     logger.error("Pega erro: {}", e.getMessage()); 
     e.printStackTrace(); 
    } 

} 

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
private void runReport() throws Exception { 
    reportExtractor.RunTest(); 
} 
} 

その他のクラス:

@RequestScoped 
public class ReportExtractor { 

@Inject 
JMSMessageManager jmsMessagerManager; 

@Inject 
private Logger logger; 

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public void RunTest() throws Exception { 

    //insert in Queue 
    jmsMessagerManager.sendMessage("test"); 

    throw new RuntimeException("test - runtime"); 
} 
} 

私は二番目に@Statefulを使用する場合、それは動作します。

それはSessionBeanのない場合は、

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

は、新しいトランザクションを作成しないのですか?または、RuntimeExceptionに基づいた自動ロールバックのみが機能しません。

@TransactionAttribute注釈が唯一のセッションBeanとメッセージ駆動型Beanのために使用することができ、

答えて

3

、ありがとうございました。 ReportExtractorはEJBでもMDBでもないので、注釈は無視され、コンテナによってトランザクションは提供されません。

あなたはCDIは、EJBのオーバー豆を管理し、Java EEの7以降で利用可能@Transactional注釈に見て希望する場合:http://docs.oracle.com/javaee/7/api/javax/transaction/Transactional.html

また、ローカルメソッド呼び出しが」勝ったのでrunReportへの呼び出しはどちらか@TransactionAttributeを尊重しないことに注意してください容器によって傍受される。これはここで説明されています:EJB Transactions in local method-calls

関連する問題