2017-05-10 2 views
0

귀에 패키지 된 엔터프라이즈 애플리케이션을 개발 중입니다. 귀는 하나의 Enterprise Bean 애플리케이션 (병), 하나의 JAX-RS 애플리케이션 (전쟁 중) 및 하나의 웹 애플리케이션 (전쟁 중)으로 구성됩니다. (application.xml에)WebSphere Liberty가 여러 개의 싱글 톤 EJB 인스턴스를 시작합니다.

이어 설명은 다음과 같다 :

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE application PUBLIC 
    "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" 
    "http://java.sun.com/dtd/application_1_3.dtd"> 
<application> 
    <display-name>myapp-ear</display-name> 
    <module> 
    <web> 
     <web-uri>myapp-war-1.0.0-SNAPSHOT.war</web-uri> 
     <context-root>/</context-root> 
    </web> 
    </module> 
    <module> 
    <web> 
     <web-uri>myapp-rest-1.0.0-SNAPSHOT.war</web-uri> 
     <context-root>/api</context-root> 
    </web> 
    </module> 
    <module> 
    <ejb>myapp-ejb-1.0.0-SNAPSHOT.jar</ejb> 
    </module> 
</application> 

는 EJB 애플리케이션은 메소드를 포함 @Schedule @Singleton, @LocalBean 및 @Startup, 주석 싱글 톤 EJB를 포함한다.

서버가 예약 된 메소드의 세 가지 인스턴스를 동시에 시작했음을 알았고 로그를 자세히 조사하면 빈이 세 번 바인딩됨을 알 수 있습니다 (귀에있는 각 어플리케이션마다 하나씩).

이 문서 http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html

하지만에 따라입니다 :이 동작을 표시하지 않습니다 전체 프로필 WebSphere 서버에서 실행되는 유사한 응용 프로그램이 있습니다. 대신 전체 엔터프라이즈 응용 프로그램에 대해 하나의 인스턴스 만 존재합니다.

이 오류 인 경우 WLP 서버는 자바 버전 1.8.0_101

질문은에 17.0.0.1을 실행 - 아니면 WLP에서 몇 가지 중요한 설정을 놓친 거지?

답변

0

당신이 실제로 스펙을 읽고있는 것처럼 보입니다 - 싱글 톤 빈은 "JVM 당 애플 리케이션 당 하나"가되도록 강요됩니다.

Liberty는 사양을 준수하는 것으로 보입니다. WebSphere 전통적 (전체 프로파일이라고도 함)에서 관찰하는 동작은 응용 프로그램/EJB 설정이 다르거 나, 여러 응용 프로그램에서 싱글 톤 EJB를 제한 할 수있게하여 스펙을 뛰어 넘는 WebSphere 고유의 특수 기능으로 인해 발생할 가능성이 큽니다.

+0

있는 유일한 방법은 다음과 같습니다 더 나는, 문서화 된 기능은 많은 의미하는 경우가되지 않습니다 그것에 대해 생각 귀에 전체 애플리케이션을 패키징하고 있습니다. 일반적으로 하나의 인스턴스 만 필요합니다. 왜 모든 것을 패키지로 묶고 싱글 톤을 사용해야합니까? – danishrulez

2

클래스는 EJB의 고유 ID를 결정하지 않습니다. 모든 EJB에는 <app name>/<module name>/<bean name>으로 구성된 3 부분의 고유 식별자가 있습니다. 따라서 동일한 클래스가 3 개 위치에 패키지되어 있으면 3 개의 EJB 정의가 분리됩니다. 또한 EJB 클래스를 단일 위치에 패키지화 할 수 있지만 3 개의 별도 ejb-jar.xml 파일 (클래스가 공유 위치에 있다고 가정)에서 EJB로 식별하는 경우 3을 여전히 보유합니다. 이것은 모든 EJB 유형에 해당되지만 싱글 톤은 동작을보다 분명하게 만듭니다.

이 동작은 Liberty 및 전체 프로필 WebSphere에서 모두 동일합니다. 전체 프로파일 WebSphere에서 작동이 다르면 패키징의 또 다른 제한으로 인해 가능할 수 있습니다. 예를 들어, metadata-complete=true이라는 ejb-jar.xml 파일을 포함하는 WAR 또는 JAR에서 싱글 톤 클래스를 패키지화하고 해당 파일이 EJB로 싱글 톤을 정의하지 않으면 무시됩니다. 마찬가지로 버전 2.5 이하의 WAR 모듈에서 싱글 톤을 패키징하는 경우 WAR 모듈은 EJB를 지원하지 않으므로 싱글 톤은 무시됩니다.

+0

상황을 충분히 설명하지는 못했을 것 같습니다. 싱글 톤 빈 클래스는 EJB 모듈 내부의 한 위치에만 패키지됩니다. 어떤 프로젝트에도 ejb-jar.xm이 없습니다. 모든 EJB에는 주석이 달립니다. 다른 모듈은 @EJB 주석을 사용하여 필요에 따라 세션 빈을 주입하고 자신의 EJB를 정의하지 않습니다. – danishrulez

2

Duh!

pom.xml의 EJB 아카이브에 Maven 종속성이 잘못 구성되어 문제가 발생했습니다. PROVIDED 의존성이 있어야하는 것은 COMPILE 의존성으로 설정되었고 Maven은 EJB jar를 두 개의 war 파일로 패키징했습니다.

두 웹 응용 프로그램에서 모두 변경되었습니다. 이제 싱글 톤은 전체 귀에 대해 한 번만 인스턴스화됩니다.경우

는 enybody 다른, 당신의 의존성은 다음과 같이 생성되어 있는지 확인이 문제를 싸우고있다 :

<dependency> 
    <groupId>com.acme.myapp</groupId> 
    <artifactId>myapp-ejb</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <type>ejb</type> 
    <scope>provided</scope> 
</dependency> 
관련 문제