2011-03-20 4 views
3


호스트 A에있는 Foo 빈을 B 호스트의 Bar@EJB 주석으로 주입하려고합니다.
두 호스트는 모두 Glassfish-v3의 독립 실행 형 인스턴스입니다.
Glassfish 문서를 읽을 때 많은 정보를 발견했는데, 그 중 일부는 약간 모순적인 것으로 들립니다.
모든 콩에는 그것에 할당 된 이름의 글로벌 jndi가 있고 그것이 어떻게 구성되었는지 이해했습니다. What is the syntax for portable global JNDI names?. 나는 또한 Bar에서 Foo의 선언은 이런 종류의 것이어야한다는 것을 이해했다. (FooRemoteFoo의 원격 비즈니스 인터페이스이고 fooejb은 모듈이다) : @EJB(lookup=java:global/fooejb/FooRemote) FooRemote foo, 이것은 this을 기반으로한다.
내가 이해할 수없는 것은 내가 A 호스트와 B 호스트에게 서로를 알리라고 말하는 것입니다.
애플리케이션 클라이언트와 애플리케이션 서버에 대한 많은 예제를 보았지만 그런 시나리오에 대한 예제를 찾을 수 없었습니다.
this question에서 sun-web.xmlsun-web.xmlGlobal-JNDI 언급되어 있지만 EJB3.1 (이후 Portable JNDI 아니에요) 및이 sun-web.xml 위치해야 이해할 수 없다고 생각합니다. 만약 내가 할 수 있으면 그것을 피하기 위해 싶습니다.
이것은 두 가지 방식으로 주로 다릅니다 :EJB, 두 응용 프로그램 서버 (glassfish)

  1. -Dorg.omg.CORBA.ORBInitialHost = param 옵션은 없습니다 (내가 볼 수있는 한)
  2. 물론 모든 솔루션은 AB이 서로 다른 용도로 통신하는 세 번째 호스트 C.

나는 여기서 기본적인 것을 놓치고 있다는 느낌이 강합니다. 실종 된 것에 대한 조언을 정말 고맙게 생각합니다.
BTW, 필자는 가능한 한 디스크립터 파일 등을 피하고 주석에 대한 대부분의 정보를 남겨두고 호스트 IP 만 서버에 구성하려고합니다.

편집 :
이 질문의 또 다른 흥미로운 측면은로드 균형 조정이이 측면에서 사용되는 것입니다. 예를 들어 A1A2 서버가 같고 부하 분산이 어떻게 발생합니까? B에서 요청을 A1 또는 A2로 라우팅하는 것에 대한 존중

Edit2 :
은 ejb 3.1과 관련이 없지만 두 응용 프로그램 서버가 서로의 jndi를 볼 수있게하는 방법과 관련이 있다고 생각합니다. 기재. 나는 ejb 3.1과 관련이 없다고 생각한다. 3.0에서 Global가 아닌 휴대용 jndi와 비슷한 문제가있는 것 같다.
각 응용 프로그램 서버의 일부 구성이 jndi 원격 bean을 쿼리해야하는 다른 "이웃"을 구성 할 수 있다고 생각합니다.
거기에 누군가에게 단서를주는 희망.

고마워,
Ittai

답변

2
  • 는, 당신은이 작업을 얻기 위해 추가 구성이 필요하지 않습니다. 로드 밸런싱 등이 필요하다면 수동으로 설정하는 것보다 클러스터를 설정하는 것이 더 쉽다고 생각합니다.
  • 웹 프로젝트로 .war 파일을 배포하면 sun-web.xml이 WEB-INF의 web.xml 바로 옆으로 이동합니다.
  • 은 당신이 사용하는 바로 그것을 얻을 수 있어야합니다 생각 : http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#cross-appserverremoterefhttp://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#mappingRemoteejbdependency
  • 내가 관리 콘솔 또는 편집을 사용하여 글래스 피쉬 자체가 EJB 커넥터 또는 자원 어댑터를 구성하는 쉬운 방법이 있어야한다 생각했을 것이다
  • server.xml. 그러나 나는 그런 것을 지금 발견 할 수 없다.
  • 이 블로그에서 살펴하는 것 같아서 균형 EJB로드에 관해서
+0

답변 해 주셔서 감사합니다. 나는 클러스터를 사용하지 않는다. 나는 균질하지 않은 (그리고 클러스터가 아닌) 두 개의 숙주를 가지고있다. 내 질문은 두 클러스터간에 연결하는 방법으로 생각할 수 있습니다. 교차 응용 프로그램은 내가 링크 된 것입니다.하지만 이진 (휴대용이 아닌) jndi를 참조하고 설명자를 사용하고 있습니다. 간단히 말해, 여기에 새로운 정보가 보이지 않습니다. ( – Ittai

+0

Vetle Roeim은 [email protected]에서 다음과 같이 말했습니다. "이 문제에 첨부 된 테스트 케이스를보십시오 : http://java.net/jira/browse/GLASSFISH-15523 이 예제에서는 조회와 주사를 모두 사용하지만, 을 이해할 수 있어야합니다. " (아직 보지 못했습니다) – AmanicA

+0

AmanicA, 우선 감사드립니다! 현상을 게시 할 때부터 현상금을 수여했고, 내가 당신의 의견을 게시 할 때 나는 나의 시도와 함께 바위 바닥에 도달했고, 당신의 의견은 저에게 중요한 리드를주었습니다. (나는 그 문제의 테스트 케이스를 다운로드하고 내 문제를 이해하기 위해 그것에 관해서.) 그것은 정말로 내 질문에 대답하지 않았고, 다른 사람들이 대답을 찾고 있기 때문에 나는 며칠 만에 나의 해결책을 게시 할 것이다 .BTW, 나는 또한 당신을 업 그레 이드했다. OU는 나를 도왔다 :) 희망이 충분하다 – Ittai

0

우리는 원격 EJB를 사용하고 그것을 잘 작동합니다.

먼저 "호스트 A"에서 클래스가 두 호스트에 모두 존재하는 인터페이스를 구현하는 EJB가 필요합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> 
<glassfish-web-app error-url=""> 
    <ejb-ref> 
    <ejb-ref-name>RemoteEJBName</ejb-ref-name> 
    <jndi-name>corbaname:iiop:<servername or IP>:3700#java:global/<projectname>/FooClassImpl!com.test.foo.FooClass</jndi-name> 
    </ejb-ref> 
</glassfish-web-app> 

에서 :

//For host A + B 
public interface FooClass { 
    public void theMethod(); 
} 

//Only for host A 
@Stateless 
public class FooClassImpl implements FooClass { 
    public void theMethod(){//Code goes here} 
} 

그럼 당신은 (호스트 B에) 만들 원격 EJB가 위치한 지정하여 WEB-INF 디렉토리에있는 글래스 피쉬 - web.xml 파일이 필요합니다 호스트 B의 주입 지점에 다음과 같이 EJB를 주입해야합니다.

@EJB(name = "RemoteEJBName") 
private FooClass theFooClassInstance; 

이 트릭이 수행되기를 바랍니다.

관련 문제