2012-05-23 2 views
1

XA (2 상) 트랜잭션을 사용하고 있습니다. 로그 클래스와 엔티티 관리자를 통해 하나의 로그 테이블에 로그하려고합니다. EJB 세션 bean 내 메소드는 다음과 같습니다.ejb3는 세션 빈 내의 격리 된 (자율적 인) 트랜잭션

"외부"트랜잭션과 관계없이 격리 된 (자율적 인) 트랜잭션으로 원합니다. 메서드 이름 앞에 @TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)을 이미 추가하려고 시도했지만 작동하지 않습니다.

try { 
    UserTransaction transaction = (UserTransaction)context.lookup("javax.transaction.UserTransaction"); 
    transaction.begin(); 
    // Call EJB3 method 
    transaction.commit(); 
} catch (Throwable t) { 
    t.printStackTrace(); 
    try { 
     transaction.rollback(); 
    } catch (SystemException e) { 
     e.printStackTrace(); 
    } 
} 

내가 수행 여부를 확약하는 경우에 상관없이 로그인 할 : 나는 EJB3 메소드를 호출하기 전에 같은

나는 사용자 트랜잭션을 생성합니다. 어떻게? 프록시를 통해 호출 할 때

감사

답변

0

트랜잭션 속성에만 관련이 있습니다. 직접 호출에는 적용되지 않으며 개인 메서드가 포함됩니다. (당신은 EJB 3.0이있는 경우 로깅을위한 별도의 로컬 인터페이스를 만들 수 있지만, EJB 3.1없는 인터페이스 뷰를 사용)는 다음과 같은 것을보십시오 :

@Stateless 
@Local(BusinessInterface.class) 
@LocalBean 
public class MyBean { 
    @EJB MyBean logger; 

    @TransactionAttribute(REQUIRED) 
    public void businessMethod() { 
    try { 
     ... 
    } catch (Throwable t) { 
     logger.logError(t); 
     ... 
    } 
    } 

    @TransactionAttribute(NOT_SUPPORTED) 
    public void logError(Throwable t) { 
    ... 
    } 
} 

중요한 조각 logError에 대한 호출이 발생된다 주입 된 EJB 프록시를 통해 컨테이너가 logError 메소드의 지속 기간 동안 XA 트랜잭션을 일시 중단하는 제어를 허용합니다.

+0

예. 그러나 logError 메소드에서 사용자 (XA 트랜잭션)가 모든 것을 커밋하거나 롤백하는지 여부와 관계없이 데이터를 "커밋"합니다. 나는 이것을 시도했지만 작동하지 않는다 ... logError 내부에서 persist()와 flush()를 수행한다. 그러나 운없이. 10 배 – zmeda

관련 문제