2014-02-20 1 views
3

클라이언트가 벤더 JAR 또는 구성에 의존하지 않고 EJB3 빈에 액세스하는 클라이언트를 생성 할 수 있습니까? 우리는 현재 우리의 서비스가 WebSphere 또는 JBoss 서버에 배포되고 클라이언트가 WAS 또는 JBoss에 응용 프로그램으로 배포되거나 독립 실행 형 응용 프로그램으로 실행되는 시나리오를 지원해야합니다.벤더 중립적 EJB3 클라이언트 생성

EJB2.x beans를 사용하여이 작업을 수행 할 수 있었기 때문에 RMIC를 사용하여 스텁을 생성해야했습니다.

그러나 EJB3에서 WebSphere에 연결하는 경우 thinclient JAR을 포함해야하며 WAS 도구를 사용하여 스텁을 미리 생성해야합니다. JBoss의 경우 jboss-client.jar을 사용해야합니다.

+0

원격 호출을 위해 ejb를 사용하는 것이 좋습니다. –

+0

예, 저는 그것에 대해서도 생각했습니다. 그러나 우리는 이미 EJB에 대해 깊이 생각하고 있습니다. 게다가 우리는 RMI를 사용하여 얻은 성능 향상을 잃을 수 없습니다. – Renan

+0

만료에 따른 성능 차이는 무시해도 좋습니다. jax-ws의 성능이 걱정된다면 jax-rs와 java serialization을 사용할 수도 있습니다. –

답변

3

아니요, 불가능합니다. 이것은 EJB 3.2 사양의 섹션 10에 명시하게되었습니다

이 장에서는 네트워크를 통해 분산 된 클라이언트 에서 EJB 2.1 원격 클라이언트보기를 통해 엔터프라이즈 빈에 액세스하기위한 상호 운용성 지원에 대해 설명하고, 분산 상호 운용성 Java EE (Java Platform, Enterprise Edition) 구성 요소 인 원격 클라이언트 에서 엔터프라이즈 bean에 대한 호출 요구 사항. 분산 상호 운용성이 EJB 3.x 원격 클라이언트보기에 정의되어 있지 않습니다.

시스템 값 클래스가 javax.ejb.Handle, javax.ejb.HomeHandle, javax.ejb.EJBMetaData, 자바 구현 직렬화 값 클래스들이다 :

또한 섹션 10.5.5 참고 .util.Enumeration, java.util.Collection 및 java.util.Iterator 인터페이스를 지원합니다. 이러한 값 클래스는 EJB 컨테이너 공급 업체에서 제공합니다. 참조 된 bean을 호스트하는 컨테이너가 JAR 파일 형식으로 제공해야합니다.상호 운용성 시나리오의 경우 참조 구성 요소가 런타임에서 시스템 값 클래스를 사용하는 경우 배포자는 참조되는 구성 요소를 에서 참조하는 Bean을 호스팅하는 컨테이너에서 제공하는 시스템 값 클래스 을 사용할 수 있어야합니다. 예를 들어 시스템 값 클래스를 참조하는 컨테이너의 클래스 경로에 포함 시키거나 배포 도구에 제공하여 참조 구성 요소의 응용 프로그램과 함께 시스템 값 클래스를 배포하여이 작업을 수행 할 수 있습니다.

WebSphere Application Server의 경우 EJB thinclient에는 CosNaming을 사용하는 IBM JNDI 구현뿐만 아니라 이러한 시스템 값 클래스가 포함됩니다. 이론적으로는 시스템 값 클래스가 필요하지 않고 클라이언트 JVM에 CosNaming을 구현 한 자체 ORB가있는 경우이 thinclient는 필요하지 않습니다.

+0

SUN CosNaming 클래스를 사용하고있다. '일치하지 않는 직렬화'문제로 인해 실행 중입니다. 아마도 WAS 시스템 값 클래스가 SUN 시스템 값 클래스와 일치하지 않습니다. – Renan

+0

특정 예외 메시지/스택을 제공 할 수 있으면 (아마도 질문 설명을 업데이트하거나 다른 질문), 나는 더 자세히 살펴 보려고 노력할 수 있습니다. 아마도 인수/반환/예외에 대한 값 클래스는 클라이언트와 서버간에 다르겠습니까? 그렇지 않으면 아마도 t 여기에 Sun/Oracle 또는 WAS 코드의 interop 버그가 있습니다. –

2

짧은 답변 :

  • 인터페이스 클래스 : 클라이언트가 세 가지를 필요로 아니,이 수는 없습니다. AS 서버의
  • 클라이언트 라이브러리 (예, 슬프게도)
  • 클라이언트 서버 주소/JNDI 조회 경로 (QA, 자극 등)

을 알려주는 구성이 클라이언트가 실행중인 경우 동일한 제품 (JBoss와 JBoss 통신)을 사용하면 클라이언트 라이브러리가 필요없고 원격 조회 만 수행 할 수 있습니다. 클라이언트/서버 응용 프로그램 서버가 혼합되어 있으면 다른 서버 제품에서 한 제품의 클라이언트 라이브러리를 실행해야하므로 작업이 복잡해집니다.

클라이언트로 실행되는 독립 실행 형 응용 프로그램에 대해 말하면서 인터페이스 클래스뿐만 아니라 두 서버의 클라이언트 라이브러리도 포함하는 1 개의 무거운 클라이언트 jar/lib를 빌드하고 제공합니다. 그런 다음 클라이언트 구성의 플래그에 따라 JBoss 또는 Websphere를 기반으로 작성된 올바른 InitialContext를 반환하는 작은 도우미 클래스를 제공하십시오.

나는이 마지막 아이디어가 "클라이언트"로 실행되는 다른 AS 제품에서도 작동 할 수 있지만 깨끗한 해결책이 아니라는 것을 알고 있습니다.

+1

우리는 실제로 이미 게이트웨이 역할을하는 클래스가있는 1 개의 무거운 클라이언트 JAR을 가지고 있습니다. 우리의 관심사는 WAS thinclient JAR이 비교적 큰 (총 17MB) 것입니다. 라이센싱 문제로 인해 jboss-client.jar을 우리 제품에 번들로 제공 할 수 없습니다. – Renan

+0

당신은 끔찍한 상황에 처해 있습니다. (라이센스 문제가있는 것 외에, 실행중인 WebSphere 어플리케이션에서 JBoss 클라이언트 jar를 필요로한다는 것을 상상해보십시오. 물론 로컬 EJB를 조회합니다.) 물론 코드화 된 조회로 가능하고 원격 호출하지만, EJB/Inject 어노테이션을 사용하고 JEE 자습서에서 아주 멋지게 보이는 섹시한 HelloWorld 예제와는 너무 멀리 떨어져있다. ( –