2010-05-03 4 views
1

Linux에서 x86_64 OpenJDK 1.6을 사용하여 Tomcat 6.24에서 Singleton을 구현하려고합니다.클래스 로더로 인해 Tomcat 웹 응용 프로그램에서 싱글 톤 패턴을 구현하는 데 문제가 있습니다.

내 응용 프로그램은 JSP와 정적 컨텐츠의 일부이며 JSP는 Java 코드를 호출합니다. 현재 web.xml을 그냥 다음과 같습니다

I 클래스는 두 개의 서로 다른 클래스 로더에 의해로드 된 지 한 이후 두 번 인스턴스화지고 한 내 싱글을로드 할 때 전에
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 

<description> 
    App Name 
</description> 
<display-name>App Name</display-name> 

<!-- The Usual Welcome File List --> 
<welcome-file-list> 
    <welcome-file>pages/index.jsp</welcome-file> 
</welcome-file-list> 

</web-app> 

(잘 모르겠어요 왜) 각 로더는 내 응용 프로그램에서 받아 들일 수없는 싱글 톤 인스턴스를 생성합니다. 나는 마침내 내 코드를 항아리로 내 보낸 다음 $ CATALINA_HOME/lib에 넣었을 때 단 하나의 인스턴스 만 있었지만 이것이 우아한 해결책은 아닌지를 알아 냈습니다.

나는 수 시간 동안 인터넷 검색을 해왔지만, 아직 아무 것도 생각 나지 않았습니다. 다른 해결책이 있는지 궁금하네요. 현재 JSP를 사전 작성하지 않고 있는데, 이것이 문제의 일부가 될 수 있습니까? 싱글 톤이 생성되도록하기 위해 서블릿을 작성할 수 있습니까? 그렇다면 어떻게해야합니까?

+0

하나의 webapp 또는 둘 이상의 webapp 만 있습니까? – nojo

+0

단 하나의 webapp이 싱글 톤을 사용합니다. – jwegan

답변

2

확인을 ServletContextListener를 정의, 드디어 문제를 알아 냈어.

나는 server.xml에 a를 추가하고 경로를 ""로 설정하여 내 응용 프로그램을 서버의 기본 응용 프로그램으로 만들었습니다. 그러나, 내가 URL을 통해 http://localhost/somepage.jsp somethings뿐만 아니라 URL을 http://localhost/appname/anotherpage.jsp 다른 것들을 위해 액세스 할 때.

http://localhost/appname 대신 http://localhost/을 사용하도록 모든 URL을 변경하면 문제가 해결되었습니다.

0

싱글턴은 언제 만들어 집니까?

<%! MySingleton instance = MySingleton.getInstance(); %> 

행을 포함하여 index.jsp이로드 될 때 강제로 생성 할 수 있습니다.

당신을 결코 자동 장전 클래스 나 JSP

+0

여러 JSP는 메소드 실행 과정에서 싱글 톤을 사용하는 클래스의 메소드를 호출합니다. JSP를 사전 처리 컴파일 해보고 이것이 해결할 수 있는지 살펴 보겠습니다. – jwegan

+0

@jwegan,로드 된 첫 번째 JSP에이를 추가하여 나중에 응용 프로그램 흐름에서 가능한 경주를 막아주는 알려진 최초 사용을 소개합니다. index.jsp는 싱글 톤을 사용할 필요가 없습니다. 단지 알려진 포인트에서 인스턴스화되도록합니다. – rsp

+0

<%! MySingleton 인스턴스 = MySingleton.getInstance(); %>를 index.jsp에 넣고 index.jsp가로드되면 생성자가 두 번 호출되는 것처럼 보입니다 (생성자에서 stderr로 인쇄하여 확인 됨). 나는 클래스의 정적 초기화의 일부로 싱글 톤을 생성합니다. 그래서 어떤 이유에서 두 클래스 로더가 index.jsp를 처리하는 것과 관련이 있습니다. – jwegan

1

싱글 톤의 올바른 초기화를 보장하기 위해, 당신은 기본 부모를 사용하고 있는지 확인해야합니다 싱글 싱글 :-)을 유지해야한다의를 JSP로의 사전 처리 컴파일과 바람둥이를 구성하는 경우 첫 번째 클래스 로더는 http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html을 참조하십시오.

는 그런 다음 ServletContextListener를 정의하는 방법에 싱글을 intialise : 보장

contextInitialized(ServletContextEvent sce) 

은 서블릿 또는 필터의 전에 호출 할 수 있습니다.

모든 ServletContextListeners은 웹 응용 프로그램의 모든 필터 나 서블릿하기 전에 컨텍스트 초기화 통보 가 초기화된다.

당신의 web.xml에

+0

감사합니다. 문맥에 관한 게시물을 통해 /및 /을 통해 애플리케이션에 액세스했기 때문에 문제가 있다는 것을 알게되었습니다. – jwegan

0

http://localhost/appname 대신 http://localhost/을 사용하도록 모든 URL을 변경하면 문제가 해결되었습니다.

이는 웹 응용 프로그램이 2 개 배포되어 동일한 클래스 로더를 사용해야 함을 의미합니다. 이것은 사실이 아닙니다. 모든 웹 응용 프로그램에서 사용하는 공유 라이브러리가 필요하면 "Tomcat Shared"(shared.loader에 의해 catalina.properties 파일에 구성 가능)로 표시된 경로에 저장해야합니다. 이 아니고이 webapp의 라이브러리 또는 Tomcat/lib에이 라이브러리가 있는지 확인해야합니다.