损坏的 CORBA 对象引用

Posted

技术标签:

【中文标题】损坏的 CORBA 对象引用【英文标题】:Broken CORBA object references 【发布时间】:2011-01-04 16:51:22 【问题描述】:

我正在做作业,但卡住了。 任务是使用默认仆人服务对象。但是当我尝试使用参考时,奇怪的事情发生了。 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;
    

如果我将 _this_object().toString() 放入 try 块并将其放入 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 中抛出EmptyStackException 时出现问题_this_object() cmets 说了一些关于调用上下文的内容,但谷歌没有告诉我那是什么。

【问题讨论】:

【参考方案1】:

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

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

而不是

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

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

【讨论】:

以上是关于损坏的 CORBA 对象引用的主要内容,如果未能解决你的问题,请参考以下文章

grizzly corba学习

打开access出现数据库或项目包含一个对文件“FPDTC.DLL版本1.丢失或损坏的引用”为啥?

ACCESS 数据库或项目包含一个对文件“dao360.dll”版本5.0的丢失的或损坏的引用,如何解决?

对 `CORBA::ValueBase::ValueBase()' 的未定义引用,我该如何解决? (在omniORB中使用哪个库)

在 Java 中运行嵌入式 CORBA 命名服务

如何在 CORBA IDL 中声明/使用对结构的前向引用?