로컬 객체에 대해 휴대용 인터셉터를 사용하는 방법이 JacorB 3에서 변경되었습니다. 릴리스 노트에 " 로컬 객체에 대해 올바르게 구현 된 휴대용 인터셉터" 이 새로운 구현으로 인해 문제가 발생하는 것으로 보입니다. GssUpClient.bat 후JacORB 3.x에서 로컬 객체에 대한 휴대용 인터셉터의 사용이 부숴 졌습니까?
public class GssUpServer extends SASDemoPOA {
private ORB orb;
private boolean calledPrintSAS = false; // added
public GssUpServer(ORB orb) {
this.orb = orb;
}
public void printSAS() {
try {
org.omg.PortableInterceptor.Current current = (org.omg.PortableInterceptor.Current) orb
.resolve_initial_references("PICurrent");
org.omg.CORBA.Any anyName = current
.get_slot(org.jacorb.security.sas.SASInitializer.sasPrincipalNamePIC);
if (anyName.type().kind().value() == org.omg.CORBA.TCKind._tk_null) {
System.out.println("Null Name");
} else {
String name = anyName.extract_string();
System.out.println("printSAS for user " + name);
}
// /* added
if (!calledPrintSAS) {
calledPrintSAS = true;
// local call, (JacORB 3.x: throws NPE from SASClientInterceptor)
_this().printSAS();
}
// */
} catch (Exception e) {
e.printStackTrace();
}
}
...
}
스택 트레이스 :
2013-04-11 11:01:24.968 SEVERE unexpected exception during servant_preinvoke org.jacorb.security.sas.SASClientInterceptor.send_request(SASClientInterceptor.java:194)
org.jacorb.orb.portableInterceptor.ClientInterceptorIterator.invoke(ClientInterceptorIterator.java:129)
org.jacorb.orb.portableInterceptor.AbstractInterceptorIterator.iterate(AbstractInterceptorIterator.java:66)
org.jacorb.orb.portableInterceptor.ClientInterceptorIterator.iterate(ClientInterceptorIterator.java:87)
org.jacorb.orb.DefaultClientInterceptorHandler.invokeInterceptors(DefaultClientInterceptorHandler.java:328)
org.jacorb.orb.DefaultClientInterceptorHandler.handle_send_request(DefaultClientInterceptorHandler.java:132)
org.jacorb.orb.Delegate.servant_preinvoke(Delegate.java:2505)
org.omg.CORBA.portable.ObjectImpl._servant_preinvoke(ObjectImpl.java:135)
org.jacorb.demo.sas._SASDemoStub.printSAS(_SASDemoStub.java:73)
org.jacorb.demo.sas.GssUpServer.printSAS(GssUpServer.java:46)
org.jacorb.demo.sas.SASDemoPOA._invoke(SASDemoPOA.java:47)
org.jacorb.poa.RequestProcessor.invokeOperation(RequestProcessor.java:348)
org.jacorb.poa.RequestProcessor.process(RequestProcessor.java:670)
org.jacorb.poa.RequestProcessor.run(RequestProcessor.java:820)
java.lang.NullPointerException
at org.jacorb.security.sas.SASClientInterceptor.send_request(SASClientInterceptor.java:194)
at org.jacorb.orb.portableInterceptor.ClientInterceptorIterator.invoke(ClientInterceptorIterator.java:129)
at org.jacorb.orb.portableInterceptor.AbstractInterceptorIterator.iterate(AbstractInterceptorIterator.java:66)
at org.jacorb.orb.portableInterceptor.ClientInterceptorIterator.iterate(ClientInterceptorIterator.java:87)
at org.jacorb.orb.DefaultClientInterceptorHandler.invokeInterceptors(DefaultClientInterceptorHandler.java:328)
at org.jacorb.orb.DefaultClientInterceptorHandler.handle_send_request(DefaultClientInterceptorHandler.java:132)
at org.jacorb.orb.Delegate.servant_preinvoke(Delegate.java:2505)
at org.omg.CORBA.portable.ObjectImpl._servant_preinvoke(ObjectImpl.java:135)
at org.jacorb.demo.sas._SASDemoStub.printSAS(_SASDemoStub.java:73)
at org.jacorb.demo.sas.GssUpServer.printSAS(GssUpServer.java:46)
at org.jacorb.demo.sas.SASDemoPOA._invoke(SASDemoPOA.java:47)
at org.jacorb.poa.RequestProcessor.invokeOperation(RequestProcessor.java:348)
at org.jacorb.poa.RequestProcessor.process(RequestProcessor.java:670)
at org.jacorb.poa.RequestProcessor.run(RequestProcessor.java:820)
문제 를 재현하는 가장 쉬운 방법은 SAS-데모에서합니다 (jacorb와 함께 제공되는 하나)을 GssUpServer.java을 수정하는 것입니다
위의 코드는 JacORB 2.3.1에서 완벽하게 작동합니다. 이 문제의 간단한 해결 방법은 속성 jacorb.isLocalHistoricalInterceptors
을 true로 설정하는 것입니다. 그러나 특정 "기본 제공"방법 (예 : _is_a()
)은이 플래그를 사용하지 않으므로 (해당 방법은 is_really_local()
을 사용하여 개체 지역을 직접 확인하기 때문에). 이러한 "기본 제공"메서드 호출은 로컬에서 호출 할 때 절대로 인터셉터를 사용하지 않았던 것으로 보입니다.
그래서 나의 관찰은 다음과 같습니다
- JacORB 3.x를 지역 통화에 대한 몇 가지 휴대용 인터셉터을 깰 것으로 보인다 (정확히 말하면, 연결 객체가 필요 인터셉터 ...)
- JacORB 3 .x와는
_is_a()
,_non_existent()
,_interface()
로 만든 지역 통화 휴대용 인터셉터를 사용하는 최초의 JacORB 것 같다_get_component()
JacORB 3.x가 이전 버전으로 작동하도록하는 속성이 있기 때문에 첫 번째 문제는 해결할 수 있습니다. 두 번째 것은 (첫 번째와 결합 된) 정말로 번거로운 것 같습니다.
누구도 이런 종류의 행동을 알아 차렸고 이것이 용의자가 JacORB 3.x에서 실제로 결함인지 또는 내가 놓친 것이 있는지 확인할 수 있습니까?
나는 두렵다 나는 이것을 늦게 대답을 볼; 공식 JacorB 메일 링리스트는 http://www.jacorb.org/contact.html이고 bugzilla는 http://www.jacorb.org/bugzilla입니다. –
고마워요! 우리는이 소프트웨어에 대한 빠른 패치를 작성한 후이 문제를 잊어 버렸습니다. 나는 아마 당신의 bugzilla를 바로 사용 했어야합니다 :) –