破坏的CORBA对象引用

时间:2011-01-04 16:51:23

标签: java corba

我正在做作业并且卡住了。 任务是使用默认服务方提供对象。但是当我尝试使用引用时,会发生奇怪的事情。 corba的某些部分打印了堆栈跟踪,但没有抛出任何异常。当服务器收到引用并且应该在其上调用某个方法时,会发生此问题。然后缩短引用并且不包含对象ID(这意味着我的servant实现不能做任何合理的事情)。

这是服务方的实现,出现问题:

public class ModelFileImpl extends ModelFilePOA{
   @Override
    public String getName() {
        try {
            return new String(_poa().reference_to_id(_this_object()));
        } catch (Throwable e) {}
        assert false;
        return null;
    }
}

如果我在try块中取_this_object()。toString()并将其放入dior -i我得到这个:

------IOR components-----
TypeId  :   IDL:termproject/idl/ModelFile:1.0
TAG_INTERNET_IOP Profiles:
    Profile Id:     0
    IIOP Version:       1.2
    Host:           127.0.0.1
    Port:           45954
    Object key (URL):   %AF%AB%CB%00%00%00%00%20Q%BA%F4%FF%00%00%00%01%00%00%00%00%00%00%00%01%0000%00%08RootPOA%00%00%00%00%08%00%00%00%02%00%00%00%00%14
    Object key (hex):   0xAF AB CB 00 00 00 00 20 51 BA F4 FF 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 08 52 6F 6F 74 50 4F 41 00 00 00 00 08 00 00 00 02 00 00 00 00 14 
    -- Found 2 Tagged Components--
    #0: TAG_CODE_SETS
        ForChar native code set Id: ISO8859_1
        Char Conversion Code Sets: UTF8
, Unknown TCS: 10020
        ForWChar native code set Id: UTF16
        WChar Conversion Code Sets: Unknown TCS: 10100
    Unknown tag : 38

然而,作为引用的服务器部分和客户端将引用视为

------IOR components-----
TypeId  :   IDL:termproject/idl/ModelFile:1.0
TAG_INTERNET_IOP Profiles:
    Profile Id:     0
    IIOP Version:       1.2
    Host:           127.0.0.1
    Port:           45954
    Object key (URL):   %AF%AB%CB%00%00%00%00%20Q%BA%F4%FF%00%00%00%01%00%00%00%00%00%00%00%02%00%00%00%08RootPOA%00%00%00%00%09modelPoa%00%00%00%00%00%00%00%10testModel1.MyIDL%14
    Object key (hex):   0xAF AB CB 00 00 00 00 20 51 BA F4 FF 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 08 52 6F 6F 74 50 4F 41 00 00 00 00 09 6D 6F 64 65 6C 50 6F 61 00 00 00 00 00 00 00 10 74 65 73 74 4D 6F 64 65 6C 31 2E 4D 79 49 44 4C 14 
    -- Found 2 Tagged Components--
    #0: TAG_CODE_SETS
        ForChar native code set Id: ISO8859_1
        Char Conversion Code Sets: UTF8
, Unknown TCS: 10020
        ForWChar native code set Id: UTF16
        WChar Conversion Code Sets: Unknown TCS: 10100
    Unknown tag : 38

(“modelPoa”(使用默认客户端的poa的名称)和对象键中的“testModel1.MyIDL”(对象的标识符)在第一个中丢失了)

我试过嗅探流量,发现客户端仍然发送了正确的引用。

这是我创建引用的方式:

ret[i] = ModelFileHelper.narrow(modelFilePoa.create_reference_with_id(files[i].getBytes(), ModelFileHelper.id()));

这就是我设置服务器的方式:

// init ORB
ORB orb = ORB.init(args, null);

// init POA
POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));

// create the POA for the models.
Policy[] policies = {
    poa.create_request_processing_policy(RequestProcessingPolicyValue.USE_DEFAULT_SERVANT),
    poa.create_servant_retention_policy(ServantRetentionPolicyValue.NON_RETAIN),
    poa.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID)
};

POA modelPoa = poa.create_POA("modelPoa", poa.the_POAManager(), policies);
modelPoa.the_POAManager().activate();

modelPoa.set_servant(new ModelFileImpl());

modelPoa.the_POAManager().activate();

ModelStoreImpl impl = new ModelStoreImpl(modelPoa);
// create the object reference
org.omg.CORBA.Object obj = poa.servant_to_reference(impl);

// ... store the IOR file ...

orb.run();

我真的很感激任何指针(或引用:-))

编辑: 在花了一天时间调试corba代码之后,我发现当orb.peekInvocationInfo()在方法EmptyStackException中抛出_this_object()时出现问题。评论说出有关调用上下文的内容,但google没有告诉我那是什么。

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了一个解决方法:在从idl文件生成的文件ModelFilePoa.java中,我将调用切换到我的方法实现并创建了回复

String tmp = getName();
_out = handler.createReply();
_out.write_string(tmp);

而不是

_out = handler.createReply();
_out.write_string(getName();

这样,调用信息在我的方法中保留在堆栈上,_this_object()按预期工作。丑陋但有效: - )