我有一个已定义的idl文件,如下所示:

module Banking {
    typedef string Transactions[5];
    typedef long AccountId;

    interface Account {
        exception InsufficientFunds {};

        readonly attribute double balance;
        long lodge(in double amount);
        long withdraw(in double amount) raises (InsufficientFunds);
        readonly attribute Transactions transactions;
    };

    interface Bank {
        long accountCount();
        double totalMoney();
        Account account(in AccountId accNr);
    };
};


我用idlj编译。我已经定义了一个BankServant,供客户端与服务器进行通信,并且我有一个工作程序,其中几乎实现了所有方法。我唯一的问题是我不知道如何实现account(in AccountId accNr)方法,该方法又将返回正确的Account对象。因为我不了解CORBA,而我只是在帮助一个朋友,所以我想问一些解决方案/示例/教程,这可能有助于我破解一个简单而又可行的类布局以应对此类情况。

先感谢您。

最佳答案

它实际上取决于您用于POA(可移植对象适配器)的策略。假设您在服务器中使用RootPOA,则必须:


为Account对象创建一个实现对象。正如我在银行服务员的名字中看到的那样,通常将其称为AccountImplAccountServant

AccountServant as = new AccountServant(accNr);
您必须在POA中注册该对象。同样,这与您为POA选择的策略有关。使用默认的根POA:

org.omg.CORBA.Object o = rootPOA.servant_to_reference( as );
使用IDL编译器生成的Account将其缩小为正确的AccountHelper类型:

Account acc = AccountHelper.narrow(o);
把它返还

return acc;


该代码假定您已经为AccountServant java对象编写了一个构造函数,该构造函数接受帐号作为其第一个参数。您还必须提供BankServant到要在其中注册新创建的Account对象的POA的引用。

有很多教程。例如,参见this one,因为POA的选项集太多,需要一本书来解释所有这些内容:)。

关于java - CORBA + IDL + Java:编写仆人时需要帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4329952/

10-10 16:32