2017-02-01 21 views
1

Ich konnte nicht verstehen, warum Rollback nicht auftritt, wenn eine RuntimeException in einer neuen Transaktion ausgelöst wird.RuntimeException wird nicht zurückgesetzt

Meine 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(); 
} 
} 

Andere Klasse:

@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"); 
} 
} 

Als ich @Stateful in der zweiten verwenden, es funktioniert.

Wenn es nicht ein SessionBean ist, funktioniert dann nicht

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

eine neue Transaktion erstellen? Oder nur das automatische Rollback basierend auf RuntimeException funktioniert nicht?

Danke,

Antwort

3

Die @TransactionAttribute Anmerkung nur für Session Beans und Message Driven Beans verwendet werden kann. Da ReportExtractor weder ein EJB noch eine MDB ist, wird die Annotation ignoriert und es wird keine Transaktion vom Container bereitgestellt.

Wenn Sie CDI bevorzugen Managed Beans über EJBs, schauen Sie in die @Transactional Annotation seit Java EE verfügbar 7: http://docs.oracle.com/javaee/7/api/javax/transaction/Transactional.html

Bitte beachten Sie auch, dass der Aufruf von runReport nicht respektieren die @TransactionAttribute entweder weil lokale Methodenaufrufe gewonnen‘ t vom Container abgefangen werden. Dies wird hier erklärt: EJB Transactions in local method-calls

Verwandte Themen