Axis2 웹 서비스와의 동시성을 처리하는 올바른 최선의 방법을 알고 싶습니다.자바 동시성 : 웹 서비스 액세스 쓰레드 세이프
예는이 코드를 부여 :
public class MyServiceDelegate
{
@Resource
UserWebService service; // Injected by spring
public CustomerDTO getCustomer()
{
String sessionString = getSessionStringFromCookies();
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
}
참고 UserWebService 위가 제 3 자 API입니다에 그. 이 서비스는 전화를 걸 때 인증 된 세션으로 JSESSIONID
의 쿠키를 전달해야합니다.
이 문장이 threadsafe가 아니라고 가정하면 올바르게 맞습니까? IE., 두 개의 스레드가 주어지면 다음과 같은 현상이 발생할 수 있습니까?
- ThreadA :
service.setJSESSIONID("threadA")
- ThreadB :
service.setJSESSIONID("threadB")
- ThreadA : 그렇다면
service.getCustomerFromSessionID // service.sesionID == "threadB"
,이 상황을 처리 할 수있는 가장 적절한 방법은 무엇입니까? 서비스 용 리소스 풀을 사용해야합니까? 아니면 서비스를 동기화 된 것으로 선언해야합니까?
public CustomerDTO getCustomer()
{
synchronized(service) {
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
}
이 문제를 해결하는 또 다른 방법이 있습니까?
이것은 가능하지만 비용이 많이 드는 것처럼 보입니다. 현재 대리자는 싱글 톤 범위가있는 스프링 빈으로 선언됩니다. 프로토 타입을 사용하도록 변경할 수 있으므로 매번 위임자와 서비스를 인스턴스화 할 수 있지만 오버 헤드가 많이 발생합니다. 더 좋은 방법이 있습니까? –
대체 디자인을 추가 할 경우 편집 됨 – djna