3

웹 서비스를 무국적 세션 빈으로 노출하면 스레드 안전과 관련된 이점이 있습니까?
(내가 틀렸다면 수정하십시오.)하지만 웹 서비스는 스레드로부터 안전하지 않으며 서블릿처럼 웹 서비스 클래스의 인스턴스 하나만 서버에서 생성됩니다 (요청 당 하나의 인스턴스가 아님).웹 서비스를 무국적 세션 빈으로 노출하면 스레드 안전의 이점이 있습니까?

스테이트리스 빈과 같은 빈 풀에서 할당되었는지 여부는 앱 서버에서 알 수 있습니다. @WebService annotation으로 이미 주석 처리 된 웹 서비스에서 @Stateless annoation을 사용하는지 확인하려고합니다. 앱 서버가 각 수신 요청에 대해 풀에서 할당하도록 시작합니다. 그렇게하면 각 들어오는 요청에 대해 생성 된 하나의 인스턴스를 확실히 알 수 있습니까?

답변

9

소개 웹 서비스 엔드 포인트에서 사용하는 경우의 수는 사용중인 프레임 워크에 따라

.

간단한 엔드 포인트 (즉, Apache CXF 또는 Spring 웹 서비스와 함께 JAX-WS)를 사용하면 모든 스레드/요청 (예 : 서블릿)에 대해 단일 서비스 인스턴스를 갖게됩니다. 따라서 정의상 이러한 종류의 서비스는 무국적자가 될 수 있습니다. 그러나 서비스에 일부 상태를 추가해야하는 경우이를 수행 할 수 있지만 서비스 스레드를 안전하게 만드는 것은 개발자의 몫입니다.

EJB를 사용하면 유연성이 향상됩니다. stateless beans를 사용하는 경우 모든 요청을 관리하기위한 인스턴스 풀이 있습니다 (poolSize = 1 인 경우 Apache CXF의 동일한 동작을 얻음). 다시 말하지만, 상태 비 저장 빈에 상태를 추가 할 수는 있지만 관리 할 인스턴스 풀이 있으므로 스레드 안전성을 높이는 것이 훨씬 어렵습니다. 그러나 상태가 필요한 경우에는 상태 기반 빈을 사용하여 스레드 안전성에 대한 사용자의 작업을보다 쉽게 ​​만드는 프레임 워크를 사용할 수 있습니다. 당신이 당신의 서비스에 상태를 유지하지 않는 경우 서비스 상태에 대한

일부 힌트는

웹 서비스는 스레드 안전합니다. 즉, 정의에 의해 스레드 안전 인 경우 Stateless 서비스입니다.

모든 스레드/요청이 공유해야하는 상태가 필요한 경우 상태 비 저장 서비스 (JAX-WS 또는 poolSize = 1 인 상태 비 저장 세션빈)에 상태를 추가 할 수 있지만 스레드 안전성을 유지해야합니다. , sycn 블록을 추가하십시오 (귀하의 @WebMethod을 동기화하지 마십시오). 중요 : 이론적으로 (그리고 실제로) 상태 저장없는 세션 빈에 상태를 추가하면 안됩니다. 왜냐하면 풀은 "원할"때 인스턴스를 삭제하거나 만들 수 있기 때문입니다.

현재 스레드/요청에 의해서만 사용되는 상태를 유지해야하는 경우 ThreadLocal 변수를 사용하거나 상태 기반 세션 빈을보다 쉽게 ​​사용하여 상태가없는 서비스에 상태를 추가 할 수 있습니다. 그들이

  • 다른 유일한 :-) 온 상태가 안 :

    지금, 마지막으로, 귀하의 질문에 대답

    1. 무 상태 세션 빈 스레드 당신이 그들을 스레드에 안전 할 경우에만 그리고 만약 안전 기본 웹 서비스와 Stateless Session Bean 웹 서비스 사이에서 첫 번째 인스턴스가 단일 인스턴스를 갖고 두 번째 인스턴스가 인스턴스 풀을 사용하는 경우. poolSize = 1이면 동일한 효과를 얻지 만 이론적으로 풀은 "원할 때"인스턴스를 파기 할 수 있습니다.

    당신의 응답을

  • +0

    덕분에,이 도움이 기대. 니가 끝냈어. 그래도 공식적인 참고 링크를 공유해 주시겠습니까? –

    +0

    공식적인 브리핑을 찾기는 어렵지만 찾으려고 노력할 것입니다. – ggarciao