2012-10-12 3 views
1

트랜잭션 롤백을 자동으로 테스트하고 싶습니다. 따라서 자동으로 롤백되어야하는 시스템 예외를 발생시키는 간단한 bean [src]을 구현했습니다 [1]. 또한 인터페이스 SessionSynchronization을 구현하므로 aftercompletion 메서드로 롤백에 영향을 미칠 수 있습니다. 그러나이 방법의 논증은 사실입니다. 나는 이 허위이 될 것으로 예상하고 있습니다 [2].Java EE6 (JBoss7 사용) : 자동으로 트랜잭션 롤백

JBoss 7에서 뭔가가 누락되었거나 버그입니까? 이미 버그 추적기를 검색했지만 아무 것도 찾지 못했습니다 ... 잘못된 단어를 사용했을 수 있습니까?

이 버그가 아닌 경우 : 시스템 또는 응용 프로그램 예외가 occures 경우 false로 afterCompletion 매개 변수를 설정에 관한 설정이 있습니까?


[1] :.. "다시 컨테이너 관리 트랜잭션을 롤백하는 방법은 두 가지가 있습니다 첫째, 시스템 예외가 발생하는 경우, 컨테이너가 자동으로 트랜잭션을 롤백합니다 둘째,의 setRollbackOnly를 호출하여 메서드를 사용하면 bean 메소드가 컨테이너에 트랜잭션을 롤백하도록 지시하고, Bean이 응용 프로그램 예외를 throw하면 롤백은 자동이 아니며 setRollbackOnly를 호출하여 시작할 수 있습니다. "http://docs.oracle.com/javaee/6/tutorial/doc/bncij.html

[2] : 가 ". afterCompletion 메소드는 트랜잭션이 프로토콜이 완료 커밋하는 상태 유지 세션 빈 인스턴스를 통지하고 트랜잭션이 커밋 또는 롤백되었는지 여부 인스턴스를 알려줍니다"http://docs.oracle.com/javaee/6/api/javax/ejb/SessionSynchronization.html

[SRC] :

@Stateful 
@LocalBean 
public class RollbackTestBean implements RollbackTest, SessionSynchronization { 

    int counter = 0; 
    int counterBuffer = 0; 
    private final Logger logger = Logger.getLogger(this.getClass().getName()); 

    @Override 
    public int getCounter() { 
    return counter; 
    } 

    @Override 
    public void throwSystemException() throws SystemException { 
    counter++; 
    throw new SystemException(); 
    } 

    @Override 
    public void afterBegin() throws EJBException, RemoteException { 
    logger.info("[TX]: after begin"); 
    counterBuffer = counter; 
    } 

    @Override 
    public void afterCompletion(boolean success) throws EJBException, RemoteException { 
    logger.info("[TX]: after completion: " + success); 
    if (!success) 
     counter = counterBuffer; 
    } 

    @Override 
    public void beforeCompletion() throws EJBException, RemoteException { 
    logger.info("[TX]: before completion"); 
    } 
} 

답변

2

두 SystemExceptions

org.omg.CORBA.SystemException subclass of RuntimeException 
javax.transaction.SystemException subclass of Exception 

난 당신이로부터 org.omg.CORBA.SystemException

EJB3.1 스펙은 말한다

을 사용하는 희망이있다, RuntimeException 또는 ApplicationException 인 경우 트랜잭션을 롤백해야합니다.

필자가 볼 수있는 한, ApplcationException은 JBoss 7.1.1에서는 올바르게 처리되지만 RuntimeException에서는 처리되지 않습니다.

RuntimeException을 사용하면 Statefull Bean에서 참조 (here)가 호출 될 때 유사한 문제가보고됩니다. RuntimeException을 던지려고하면 같은 오류 메시지가 나타납니다. Verion 7.1.3에서 수정되었습니다. 그러나 나는 나 자신을 시험하지 않았다.

수정 프로그램을 찾고있는 경우 7.1.3을 시도 할 수 있습니다. 당신이 당신의 예외를 가지고 트랜잭션 롤백을 원하는 경우, 귀하의 회신

@ApplicationException(rollback=true) 

매디에게

+0

감사를 사용! RuntimeException 처리를 테스트 했습니까? 아니면 remove() 문제를 기반으로 제안 했습니까? '@ApplicationException (rollback = true)'주석은 예상대로 작동합니다. –

+0

나는 둘 다 시험했다. 결과는 내가 게시 한 것이다. – Maddy

+0

다시 한번 감사드립니다! 그래서 RuntimeExceptions는 JBoss 7.1.1에서 올바르게 처리되지 않습니다 ... –