2010-02-17 9 views
3

싱글 톤 ejb가 두 번 초기화됩니다. 나는 이유를 알지 못한다. 그리고 그것은 내가 말할 수있는 한 싱글 톤 빈을 갖는 것에있어 완고하게 옹호하고있다. 어떤 도움을 주시면 감사하겠습니다. 당신이 볼 수 있듯이 정적 인 부울을 넣으려고 시도했지만 여러 차례의 초기화 작업을하지 않아도된다.Glassfish initialton Singleton bean

콩 :

@Singleton 
@Startup 
public class DataModelBean implements DataModelBeanLocal { 

    private static Logger log = Logger.getLogger(DataModelBean.class.getName()); 

    @PostConstruct 
    public void init(){ 
     log.info(this);   
    } 
} 

로그 출력 미리보기 :

2010-02-17 16:06:13,670 INFO [AutoDeployer  :DataModelBean  ] [email protected] 
2010-02-17 16:06:14,233 INFO [AutoDeployer  :DataModelBean  ] [email protected] 

이 2 콩을 만들고있다! 아니면 앱을 두 번 배포하고 있습니까?

제게 glassfish v3를 사용하고 있는데, 충분히 성숙한가요? v2 나 다른 것을 사용해야합니까? 생각?

+3

AFAIK,'@ Singleton'은 EJB 3.1의 새로운 기능이므로 GFv2는 옵션이 아닙니다. –

+0

동의하고 차라리 v3에 머물러 있지만 이와 같은 문제는 해결해야합니다. – James

+0

나는 이것을 시험하고있다 (나는 이처럼 큰 버그에 놀랄 것이다). –

답변

1

다음 싱글 :

@Singleton 
public class MasterDataCache 
{ 
    private final static Logger logger = LoggerFactory.getLogger(MasterDataCache.class); 

    private Map cache; 

    @PostConstruct 
    public void initCache() { 
     logger.debug("initCache()"); 
     this.cache = new HashMap(); 
    } 

    public Object get(String key){ 
     return this.cache.get(key); 
    } 

    public void store(String key,Object value){ 
     this.cache.put(key, value); 
    } 
} 

그리고 다음 서블릿 :

@WebServlet(name="SingletonTester", urlPatterns={"/SingletonTester"}) 
public class SingletonTester extends HttpServlet { 

    @EJB 
    MasterDataCache masterDataCache; 

    @Override 
    public void init(){ 
    masterDataCache.store("startup", new Date()); 
    } 

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     PrintWriter out = response.getWriter(); 
     try { 
      out.println("Startup time: " + masterDataCache.get("startup")); 
     } finally { 
      out.close(); 
     } 
    } 
} 

전쟁으로 패키지는 GFv3에서 "수동"배포 할 때 예상대로 작동합니다. 또한 NetBeans에서 제대로 배포되고 예상대로 작동합니다 ( initCache은 한 번만 호출 됨). 내 유일한 문제는 이클립스에서 배포가 실패한다는 것입니다 (GFv3은 eclipseApps/$projectName에 EJB 모듈이 전혀 포함되어 있지 않다고 불평하지만, eclipseApps/$projectName/WEB-INF/classses에 있음). 안타깝게도이 버전은 GlassFish Eclipse 플러그인의 버그 인 것 같습니다. 이슈 추적기에 많은 이슈가 보이지는 않습니다 ... 이상하게 보이기 때문에 큰 걸림돌처럼 보입니다. 하지만 Eclipse 외부에서는 GFv3이 정상적으로 작동하므로 문제가 재현되지 않았습니다.

업데이트 : 마침내 Eclipse와 GlassFish v3에서 작업하고 있습니다. 모든 세부 사항을 제공하지는 않겠지 만 문제는 필자의 프로젝트를 "동적 웹 모듈"2.5로 직접 인식하지 못했기 때문에 처음에는 버전이 2.3으로 설정되었고 이것이 배치 오류와 관련이 있다고 생각합니다. GFv3에서. 내 프로젝트를 올바르게 설정 한 후에 (2.5로 설정된 패싯 사용) 배치가 제대로 작동했습니다. 그래서 나는 단지 나 자신을 망쳤다.

+0

어떤 버전을 사용하고 있습니까? – vkraemer

+0

@vkraemer 틀렸어. 클래스는'eclipseApps/$ projectName/WEB-INF/classses'에 복사되었지만 glassfish는 다음과 같은 예외를 제외하고 불평한다. java.lang.RuntimeException : EJB 모듈을로드 할 수 없다. DeploymentContext에는/home/pascal/opt/glassfishv3/glassfish/domains/domain1/eclipseApps/maven-ejb31-testcase'에 대한 올바른 패키징을 보장하는 EJB 체크 아카이브가 없습니다. 하지만 제가 말했듯이, 수업은 거기에 있습니다. 버전에 대해서는 com.sun.enterprise.jst.server.sunappsrv (1.0.40)를 사용하고있는 것으로 보입니다. –

+0

@vkraemer 사실, GlassFish Eclipse 플러그인은 정상적으로 작동합니다. 어쩌면 더 의미있는 정보를 줄 수 있지만 응용 프로그램을 2.5 동적 웹 모듈로 인식 한 후에 작업하는 것이 있습니다. –

1

이 문제는 ejb-jar.xml에서 EJB 이름이 EJB 클래스 이름과 같지 않은 경우 발생합니다. 예를 들어
:

<ejb-name>MySingletonBean</ejb-name> 
<ejb-class>ru.rozge.MyTestSingletonBean</ejb-class> 

이 경우는 GF는 (: 및 "자바 : 글로벌/MyTestSingletonBean" "전역/MySingletonBean 자바") 다른 JNDI 이름 두 빈들을 등록한다. 그런 다음 초기화시 두 개의 객체, 즉 MySingletonBean과 MyTestSingletonBean을 만듭니다.
또한 주입 리소스에 @Resource 주석을 사용하는 경우 GF 작업은
입니다. 1) GF는 첫 번째 개체 "MySingletonBean"을 만들고 올바르게 리소스를 주입합니다.
2) GF는 두 번째 객체 "MyTestSingletonBean"을 생성하고 주입에 실패합니다 (주입 된 모든 리소스는 null 또는 기본값과 동일).
@Singleton @Startup 콤보로 GF 3.1 빌드 12에서 테스트되었습니다.