문제

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가 아니라고 가정 할 때 맞습니까? 즉, 두 개의 스레드가 주어지면 다음이 발생할 수 있습니까?

  • Threada : service.setJSESSIONID("threadA")
  • 스레드 B : service.setJSESSIONID("threadB")
  • Threada : service.getCustomerFromSessionID // service.sesionID == "threadB"

그렇다면이 상황을 처리하는 가장 적절한 방법은 무엇입니까? 서비스에 리소스 풀을 사용해야합니까? 아니면 서비스를 동기화로 선언해야합니까?

    public CustomerDTO getCustomer()
    {
       synchronized( service ) {
          service.setJSESSIONID(sessionString);
          CustomerDTO customer = service.getCustomerFromSessionID();
       }
    }

아니면이 문제를 처리하는 또 다른 적절한 방법이 있습니까?

도움이 되었습니까?

해결책

각 스레드에는 고유 한 대의원 객체가 있으므로 자체 userwebservice 서비스가 있습니까?

간단한 경우, 대의원이 스택에 생성되면 스레드는 독립적입니다.

창조 비용이 높으면 대표 물체의 풀을 가지고 있습니다. 수영장에서 하나를 가져가는 것은 비교할 수 있습니다. 하우스 키핑에 매우주의를 기울여야하지만 효과적으로 데이터베이스 연결로 수행됩니다. 일부 환경에는 그러한 풀링을 관리하기위한 유틸리티 클래스가 있습니다. 자신의 롤링보다 바람직한 경향이 있습니다.

다른 팁

userwebservice가 수업 중 하나입니까? 그렇다면 메소드 서명을 다음으로 변경했다고 생각합니다.

public CustomerDTO getCustomer()
{
      CustomerDTO customer = service.getCustomerFromSessionID(sessionString);
}

그리고 userwebservice가 상태를 유지하지 못하면 본질적으로 스레드-안전합니다.

당신이 말했듯이, 함수는 스레드 안전하지 않습니다. Java는 모니터를 만드는 간단한 방법을 가지고 있으며, 이는 한 번의 스레드 만 한 번에 함수에 액세스 할 수있는 객체입니다. 더 많은 정보 모니터

스레드를 안전하게 만들려면, 표현식 주위 또는 기능 이름 앞에 동기화 할 수 있습니다.

public synchronized CustomerDTO getCustomer(){
    service.setJSESSIONID(sessionString);
    CustomerDTO customer = service.getCustomerFromSessionID();
}

둘의 차이점은 모니터로 바꾸는 객체입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top