2011-11-15 3 views
0

Vaadin 응용 프로그램이 있는데 동시에 두 개의 응용 프로그램 인스턴스 (하나는 FF, 다른 하나는 IE)를 실행할 때 이상한 동작이 나타납니다. 나는 이미 대부분의 정적 객체를 제거했습니다. 이로 인해 다른 열린 응용 프로그램과 병렬로 사용될 때 응용 프로그램이 완전히 다시로드됩니다. 이제 완전한 재설정없이 UI와 정상적으로 상호 작용할 수 있습니다. 그러나 이제는 두 인터페이스에서 하나의 사용자 데이터 만 얻고 있음을 알게되었습니다. 이 문제는 일부 데이터 캐싱과 SOAP 연결을 관리하는 데 사용하는 싱글 톤 객체 때문에 발생한다고 가정합니다. 이상한 출력을 일으키는 싱글 톤 패턴인지 아니면 정적 인스턴스 객체인지 알고 싶습니다.vaadin 응용 프로그램 인스턴스가 서로 간섭하지 않도록하는 방법은 무엇입니까?

싱글 톤으로 ThreadLocal을 사용해 보았습니다 만, 싱글 톤의 기능에서 사용할 때 모든 변수가 항상 null입니다. 현재 나의 싱글 톤은 이것을 포함하고 있습니다. 난 항상 내 응용 프로그램 인스턴스 도처에서 캐시 된 데이터에 대한 액세스 내 사용자의 비누 연결이되어 줄 수 있도록

private static ThreadLocal<SoapClient> instance = new ThreadLocal<SoapClient>(); 

public static synchronized SoapClient getInstance(){ 
    if (instance.get() == null) { 
     instance.set(new SoapClient()); 
    } 
    return instance.get(); 
} 

나는 싱글 톤 객체를 선택했고, 내가 그 일에 대해 생각할 수있는 유일한 방법은이 것입니다 정적 인 어딘가에 있지만 static 키워드는 모든 문제의 원인 인 것 같습니다. 이 주변에 어떤 방법이 있습니까 아니면 다른 원인이 있습니까?

답변

4

더 좋은 방법은 그러나, 문제는 여기에 웹 애플리케이션 서버 "풀"과 재사용 스레드이다이

ThreadLocal<SoapClient> instance = new ThreadLocal<String>() { 
    @Override 
    protected String initialValue() { 
    return new SoapClient();  
    } 
} 

될 지역의 스레드를 인스턴스화합니다. Vaadin 용어로, 응용 프로그램에 대한 모든 요청이 동일한 스레드로 처리되는 것은 아닙니다. 즉, Thread1이 App 인스턴스 1과 App 인스턴스 2 모두에 대한 요청을 처리 할 수 ​​있습니다. SoapClient가 App 인스턴스 1에 적절한 정보를 캐시하면 App 2의 UI가 "응용 프로그램 특정"정보가 SoapClient에 캐시된다 (당신의 설명에서) 가정 앱 1.

에 대한 SoapClient, 난 당신이

  • 만들기 제안과 같은 응용 프로그램 개체에 SoapClient를 저장하는 것 일반 필드 (고정되지 않고 스레드 로컬이 아님)

  • SoapClient를 얻으려면 응용 프로그램에 액세스해야하며, 사용자가있는 곳에서 까다로울 경우 ThreadLocal access pattern을 사용하십시오. 링크의 두 번째 예를 참조하십시오. ThreadLocal은 HttpRequest의 시작 부분에 설정되고 마지막에는 "unset"으로 설정되어 같은 스레드에 대한 모든 후속 요청이 동일한 응용 프로그램 인스턴스를 얻지 못하도록합니다.

+0

완벽하게 작동합니다. 감사합니다. – Valyrion

관련 문제