2012-06-19 2 views
2

나는 현재 웹 서비스 인터페이스를 노출하는 자바 웹 응용 프로그램을 개발하고있다.자바 웹 서비스 개체 (JAX-WS) 수명

@WebService() 
public class ETL_WS { 
    private String TOMCAT_TEMP_DIR; 
    private final int BUFFER_SIZE = 10000000; 
    private ConcurrentHashMap myMap; 
    private String dbTable = "user_preferences"; 

    public ETL_WS() { 
     Context context = null; 
     try { 
      context = (Context) new InitialContext().lookup("java:comp/env"); 
      this.TOMCAT_TEMP_DIR = (String) context.lookup("FILE_UPLOAD_TEMP_DIR"); 
     }catch(NamingException e) { 
     System.err.println(e.getMessage()); 
    } 

    public long getCouponMapCreationTime() { 
     return couponMap.getCreationTime(); 
    } 

} 

때문에 나도 같은 ConcurrentHashMap의에는 myMap 인스턴스를 참조하는 모든 요청을 필요로한다는 사실에, 나는 웹 서비스 개체의 수명이 무엇인지 알고 싶습니다 다음과 같이 내 웹 서비스의 클래스 정의는 . 구체적으로 말하자면, 첫 번째 클라이언트 요청에서 초기화된다는 것을 알고 있습니다. 그러나, 모든 클라이언트는 그리드에는 myMap 객체의 같은 인스턴스를 볼 수? 그렇지 않다면 어떻게 가능합니까?

감사합니다.

답변

3

짧은 답변 : 아니, 당신은이 클래스의 인스턴스가 응용 프로그램 서버에 의해 생성되는 방법을 제어 할 수 없습니다. 유일한 확실한 것은 첫 번째 요청 전에 하나 이상의 객체가 인스턴스화된다는 것입니다. 일반적으로, 응용 프로그램 서버는 동일한 클래스의 객체의 수만을 의미 작업자 스레드 당 하나 개의 인스턴스를 만듭니다.

그러나, 이러한 경우에 공통의 데이터를 가질 수있어, 가장 간단한 해결책 static 멤버 변수를 사용하는 것이다. 정적 멤버는 클래스에 속해 있기 때문에 모든 개체에서 고유해야합니다.

@WebService() 
public class ETL_WS { 
    // ... 
    private static ConcurrentHashMap myMap; 
    // ... 
} 
+1

나는 싱글 대신 정적의 개체를 사용하는 생각을했다. 그러나 당신의 대답에 감사드립니다. –

1

내가 생각할 수있는 한 가지 방법은 Webservice 뒤에 싱글 톤으로 유지하는 것입니다. WS 라이프 사이클은 실제로 중요하지 않습니다. (이것은 싱글 톤입니다.하지만 WS 인터페이스의 목적은 단순히 요청할 경우 서비스의 핵심 로직을 서비스에 캡슐화하는 것이 좋습니다.

+0

"웹 서비스의 배후"란 무엇을 의미합니까? 싱글 톤 멤버 클래스가 트릭을 할 수 있다고 생각합니다. 웹 서비스 뒤에 응용 프로그램의 핵심 로직을 캡슐화하는 예를 들어 줄 수 있습니까? 빠른 답변에 감사드립니다. –