2017-02-01 6 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 не работает?

Спасибо,

ответ

3

@TransactionAttribute аннотацию можно использовать только для сессионных компонентов и сообщений приводятся бобов. Поскольку ReportExtractor не является ни EJB, ни MDB, аннотация будет проигнорирована, и никакая транзакция не будет предоставлена ​​контейнером.

Если вы предпочитаете CDI управляемых компонентов через EJBs, смотрите в @Transactional аннотации доступны с Java EE 7: http://docs.oracle.com/javaee/7/api/javax/transaction/Transactional.html

Обратите внимание, что вызов runReport не будет уважать @TransactionAttribute либо потому, что выиграли местные вызовы методов» t перехватывается контейнером. Это объясняется здесь: EJB Transactions in local method-calls