2010-05-10 3 views
3
String[] orbargs= {}; 
    org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(orbargs, null); 
    org.omg.CORBA.Object cobj = orb.string_to_object("corbaloc:iiop:10.1.1.200:6969/OurServiceHelper"); 
    _OurServiceHelper cpsh = _OurServiceHelperHelper.narrow(cobj); // Get's stuck 
    cpsh.ourMethod(); 

그 범위가 좁 힙니다.corbaloc url을 사용하여 CORBA 서비스에 연결하려고 시도했습니다.

내 서비스가 고정 포트에서 실행되도록 설정되었습니다. 그리고 우리는 NamingService를 통해 보통 그것을 보았 기 때문에 그것이 작동한다는 것을 압니다.

내가 뭘 잘못하고 있니?

+0

자바가 맞습니까? 그렇다면 다시 태그해야합니다.나는 프로세스의 스레드 덤프를 게시하는 것이 좋습니다. –

+0

문제는 내 코발론 문자열과 관련이 있다고 생각합니다. _OurServiceHelper에서 _is_a() 메소드에서 차단 중입니다. 이 모든 것은 생성 된 코드입니다. OpenOrb 코드를 추적했지만 실제로 어떤 일이 일어나고 있는지 이해하지는 못합니다. 어쨌든 테스트와 마찬가지로 IOR을 서비스 측에서 생성하여 사용했습니다. 이 작동합니다. org.omg.CORBA.Object cobj = orb.string_to_object ("IOR : hugestring"); – Megasaur

답변

1

NamingService를 사용하는 경우 실제로는 corbaloc URL 대신 corbaname url을 사용해야합니다. 다음은 네이밍 서비스가 포트 6969에있는 경우 작동합니다. "OurServiceHelper"가 6969이지만 NamingService가 다른 포트에 있으면 6969 대신 아래 URL에 이름 지정 서비스의 포트를 지정해야합니다. 서버 객체는 NamingService가 반환 한 ior에 내장되어 있기 때문에 지정하지 않아도됩니다.

"corbaname:10.1.1.200:6969#OurServiceHelper" 

재 : 우선 된 IOR에 대한 메모와 개체를 제공 : 코멘트. 처리 된 객체가 프로세스 재시작시에도 지속되도록하려면 객체가 포함 된 POA에 PERSISTENT 평생 정책을 설정해야합니다. 또한 IOR은 서버의 IP와 포트를 포함하므로 재시작 할 때마다 일관성있게 유지되는 IOR을 생성하려면 고정 IP 및 포트 번호를 사용하고 영구적 수명 정책을 사용해야합니다.

이름 서비스를 사용하면이 물건에 대해 걱정할 필요가 없으므로보다 쉽게 ​​작업을 수행 할 수 있습니다. 이름 서비스가 알려진 위치에 도달 할 수있는 한, 모든 서버 객체는 인스턴스화 될 때 이름 서비스에 등록 만 할 수 있으며 클라이언트는 어디에 있는지 알 필요없이 이름에 액세스 할 수 있습니다.

네임 서비스를 사용하지 않기로 결정했다면 코드를 약간 변경해야합니다. corbaloc URL을 사용하는 경우 Interoperable Naming Service (INS)를 사용하고 있습니다. 참조 : http://java.sun.com/j2se/1.4.2/docs/guide/idl/INStutorial.html. INS를 사용하여 NamingContextExt 개체의 기능을 사용해야합니다. 특히 corabloc url을 해결하려면 NamingContextExt::resolve_str 함수를 호출하고 url을 전달해야합니다.

+0

하지만 나는 명명이나 거래를하고 싶지 않습니다. IOR을 시작할 때 서버 IOR을 인쇄하면 클라이언트 쪽에서 참조를 다시 만들 수 있습니다. 그러나 IOR은 서버를 다시 시작하면 변경되는이 거대한 문자열입니다. 그래서 내가 찾고있는 것은 URL 형식 문자열을 기반으로 서버에 연결하는 방법입니다. 네이밍 및 트레이드가 진행되는 시스템이 다운되고 다른 시스템이 여전히 우리 서버와 통신 할 수있는 경우 유용 할 수 있습니다. – Megasaur

+0

그래서 결국 평생 정책과 물건에 대한 의견은 우리가 정말로 해왔어야했던 것이었고 나의 질문은 잘못된 질문이었습니다. – Megasaur

0

corbaloc URL (슬래시 뒤에 오는 문자열)의 핵심 부분이 잘못되었거나 올바르게 등록되지 않았을 수 있으며 serverside orb가 키를 객체 참조에 매핑 할 수 없습니다.

서버를 어떻게 실행하고 있습니까?

이 작업을해야 다음 corbaloc 요청이 구에 올 때

<server> -ORBInitRef OurServiceHelper="file://server.ior" 

는 그래서 IOR의 키와 일치하고 당신에게 IOR을 반환 할 수 있어야한다. 다른 ORB에는 초기 참조를 등록하는 방법이 다르며, TAO에는 예를 들어 IORTable이라는 적절한 인터페이스가 있습니다.

+0

다음 CORBA 속성을 사용하여 서버를 실행하고 있습니다. 서버 -pss -ORBProfile = pss -ORBPort = 6969 -ORBInitRef TradingService = corbaloc :: [email protected] : 2011/TradingService -ORBInitRef NameService = corbaloc :: 1.2 @ 10.1.1.220:2001/NameService 나는 당신이 나에게 말하고있는 것 같아, IOR을 어딘가에 써야한다는 것입니다. 그런 다음 필요할 때 바로 연결할 수 있습니다. – Megasaur

0

corbaloc에는 형식 정보가 없으므로 ORB는 원격 호출 (_is_a)을 통해 좁히고있는 형식을 확인합니다. _is_a 호출하지 것이다, 체크되지 않은 좁은를 사용해보십시오 :

_OurServiceHelper cpsh = _OurServiceHelperHelper.narrow(cobj); 

그것은 _is_a 호출이 당신을 위해 반환하지 않는 이상한. 내 생각 엔 unchecked_narrow가 작업을 수행하지만 (null이 아닌 결과를 얻음) 객체 참조가 작동하지 않는다는 것입니다.

관련 문제