2013-06-25 3 views
2

다음 요청 범위 주입은 스레드로부터 안전한가요?

@WebListener 
public class AllRequestsWebListener implements ServletRequestListener { 

    @Inject HttpRequestProducer producer; 

    public void requestInitialized(ServletRequestEvent sre) { 
    producer.requestInitialized(sre); 
    } 
} 
...

@RequestScoped 
public class HttpRequestProducer { 
... 
} 

나는 방법 - 매개 변수로 하우투 분사 요청 콩을 모르는 때문에 내가 요청 - 콩 주입의 ThreadLocal 때 제대로 작동 할 것이라고 추측 할 수있다. 누군가 스레드로부터 안전한 방식으로 구현되는 방법을 설명 할 수 있습니까?

답변

0

직관을 기반으로 대답

사용자가 여러 열 수있는 내가, 요청 범위가 스레드 (안전 세션 이상하지 않은대로, 스레드 안전 믿는다 브라우저 세션을 사용하고 동일한 세션 ID 사용)

경험적 증거이지만 테스트했지만 삽입 된 HttpRequestProducer은 각 요청마다 새 인스턴스를 가져옵니다.

requestInitializedrequestDestroyed은 서로 다른 스레드가 될 수 있으므로 두 가지 방법 모두에서 동일한 삽입 된 개체를 사용하려는 경우 더 자세히 조사 할 것입니다.

사양 백업 대답

어려운 부분은 사양에서이 주장에 대한 확실한 증거를 찾는 것이 었습니다.

CDI 사양을 살펴본 결과, @RequestScoped 객체가 스레드 안전 (예 : thread 로컬 사용)이라는 결정적인 증거를 빨리 찾을 수 없었지만 @RequestScoped 빈은 범위가 지정된 bean과 동일한 범위를 사용한다고 가정합니다. 자바 EE 5 (here 참조)

이 절은 재미가에서 : 공유 자원을 동시에 를 액세스 할 수 있도록

다중 스레드 서버에서 공유 자원에 대한 동시 액세스 제어, 그것은 가능하다. 범위 개체 특성 외에도 공유 리소스 에는 인스턴스 또는 클래스 변수와 같은 메모리 내 데이터와 파일, 데이터베이스 연결 및 네트워크 연결과 같은 외부 개체가 포함되어 있습니다 (예 : ).

동시 접속은 여러 상황에서 발생할 수 있습니다 : 웹 컨텍스트에 저장된 개체에 액세스

  • 여러 웹 구성 요소를.

  • 세션에 저장된 객체에 액세스하는 여러 웹 구성 요소.

  • 인스턴스 변수에 액세스하는 웹 구성 요소 내의 다중 스레드. 웹 컨테이너는 일반적으로 각 요청을 처리 할 수있는 스레드를 만듭니다. 서블릿 인스턴스가 한 번에 하나의 요청 만 처리하도록하려면 서블릿에서 SingleThreadModel 인터페이스를 구현할 수 있습니다. 서블릿이이 인터페이스를 구현하면 서블릿의 서비스 메소드에서 두 개의 스레드가 동시에 실행되지 않는다는 것을 보장 받게됩니다. 웹 컨테이너는 서블릿의 단일 인스턴스 에 대한 액세스를 동기화하거나 웹 구성 요소 인스턴스 풀을 유지하고 각 새 요청을 무료 인스턴스로 보냄으로써이 보증을 구현할 수 있습니다. 이 인터페이스는 정적 클래스 변수 또는 외부 객체와 같은 공유 리소스에 액세스하는 웹 구성 요소의 결과 인 동기화 문제 을 방지하지 않습니다. 또한 서블릿 2.4 사양은 SingleThreadModel 인터페이스를 더 이상 사용하지 않습니다.

그래서 이론적으로는 객체 자체가 그러나 나는이 지원되는지 하드 증거를 찾을 수 없습니다, 요청 스레드 당 하나 개의 인스턴스를해야 할 것입니다 것으로 보인다.

1

빈에서 주입 한 것은 실제 거래를 나타내는 프록시입니다. 프록시는 항상 올바른 빈에 호출을 전달합니다

관련 문제