2
@Stateless 
public class MyBean1 { 

    pulic void method1() { 
     //method implementation 
    } 

    pulic void method2() { 
     //method implementation 
    } 
} 

MyBean1의 특정 인스턴스를 생각해보십시오. 그런 다음 method1() 또는 method2()에 여러 스레드에서 동시에 액세스 할 수 없다는 것을 알고 있습니다. 그러나 method1()에 스레드가 액세스하는 동안 method2()에 다른 스레드가 액세스 할 수 있습니까?여러 스레드가 상태 비 저장 EJB의 특정 인스턴스에 대해 다른 메소드에 액세스 할 수 있습니까?

답변

2

ejb 3.1 스펙의 secion 4.3.14가 답을 줄 것이라고 생각합니다.

4.3.14 일렬 세션 콩 방법
다음과 같은 요구 사항은 Stateless 및 Stateful Session Bean에 적용됩니다. 싱글 톤 세션 빈 동시성 요구 사항은 4.8.5 절을 참조하십시오.

컨테이너는 각 상태 저장 Bean과 Stateless Session Bean 인스턴스에 대한 호출을 직렬화합니다. 대부분의 컨테이너는 동시에 실행되는 세션 빈의 많은 인스턴스를 지원합니다. 그러나 각 인스턴스는 일련의 메서드 호출 시퀀스 만 보게됩니다. 따라서 stateful 또는 stateless 세션 빈은 재진입 가능 코드로 지정할 필요가 없습니다.

모든 컨테이너 호출 콜백 (즉, beforeCompletion 비즈니스 메소드 인터셉터 방법, 라이프 사이클 콜백 인터셉터 방법, 제한 시간 콜백 메소드, 등), 그것은 이러한 콜백에게 를 직렬화해야한다 직렬화해야하는 용기 클라이언트가 호출 한 비즈니스 메서드 호출

....

는 지금까지 내가 당신이 동시성을 통해 세밀한 제어를 원할 경우 당신이 싱글 톤을 사용해야하는 EJB 스펙을 이해

(콩 관리는 컨테이너 관리).

1

것은 이제 당신의 예를 조금 예를 들어

@Stateless 
public class MyBean1 { 
    @Resource 
    private SessionContext sessionContext; 

    pulic void method1() { 
     // method implementation 
     // As a side-effect, something is written into a database 
     // using an XA data source, 
     // and a message is sent using XA JMS 
     // (both under control of an XA transaction) 
    } 

    pulic int method2(int i) { 
     return i * i; 
    } 
} 

을 수정할 수는 세션 컨텍스트UserTransactiongetCallerPrincipal를 가져 오는 데 사용됩니다. 그것들은 항상 똑같은 것은 아닙니다 (두 클라이언트가 모두 EJB 일 때). UserTransaction에 관해서는 : 현재 스레드 (Javadoc 참조)에 바인딩됩니다.

세션 컨텍스트가 필드에 저장되므로 (각 개별 메소드에 인수가 전달되지 않음) 동일한 EJB 인스턴스에 두 개의 다른 클라이언트가 액세스 할 수 없으므로 직렬화가 같은 인스턴스에를 호출에

따라서 사양은 용기를 필요로한다.

부작용이없는 순수 기능 구현 인 method2을 보면 EJB가 필요하지 않습니다.

관련 문제