JacORB 3.x中本地对象的便携式拦截器使用情况有限?

时间:2013-04-11 09:51:26

标签: java interceptor corba jacorb

实现如何将可移植拦截器用于本地对象的实现在JacORB 3中发生了变化,如 在发行说明中说明:“为本地对象正确实现了便携式拦截器。” 这个新的实施似乎会引起一些问题;重现问题的最简单方法 是从sas-demo(jacorb附带的那个)修改GssUpServer.java:

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();
            }
        }
...
}

GssUpClient.bat后的Stacktrace:

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)

以上代码在JacORB 2.3.1中运行良好。此问题的简单解决方法是将属性jacorb.isLocalHistoricalInterceptors设置为true; 但是,某些“内置”方法(例如_is_a())不尊重此标志(因为这些方法直接使用is_really_local()检查对象局部性)。它似乎 当本地调用时,这些“内置”方法调用从未使用过拦截器。

所以我的观察是:

  1. JacorB 3.x似乎打破了本地调用的一些可移植拦截器(确切地说,需要连接对象的拦截器......)
  2. JacorB 3.x似乎是第一个使用便携式拦截器进行_is_a()_non_existent()_interface()_get_component()
  3. 的本地调用的JacORB

    第一个问题是可解决的,因为有一个属性使JacORB 3.x作为旧版本工作。第二个(与第一个相结合)似乎真的很麻烦。

    有没有人注意到这种行为,并且可以验证我怀疑这确实是JacORB 3.x中的缺陷,还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

内置便携式拦截器,本地通话应正常工作;这听起来像个bug。实际上听起来像Using AMI+BiDir with jacorb。我还输入了http://www.jacorb.org/bugzilla/show_bug.cgi?id=957