我有一个定义的 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 并且我只是在帮助 friend ,我想请求某种解决方案/示例/教程,这可能会帮助我破解一个简单但有效的类布局来处理这种情况。
提前谢谢您。
最佳答案
这实际上取决于您用于 POA(可移植对象适配器)的策略。假设您在服务器中使用 RootPOA,您必须:
为帐户对象创建一个实现对象。正如我在银行仆人的名称中看到的那样,这通常称为
AccountImpl
或AccountServant
。AccountServant as = new AccountServant(accNr);
您必须在 POA 中注册该对象。这又与您为 POA 选择的政策有关。使用默认的根 POA:
org.omg.CORBA.Object o = rootPOA.servant_to_reference( as );
使用 IDL 编译器生成的
AccountHelper
将其范围缩小到正确的Account
类型:帐户 acc = AccountHelper.narrow(o);
归还
返回 acc;
此代码假定您已为 AccountServant
java 对象编写了一个构造函数,该对象接受帐号作为其第一个参数。您还必须向 BankServant
提供对要在其中注册新创建的 Account
对象的 POA 的引用。
有很多教程。请参阅this one例如,POA 的选项集太多,需要一本书来解释它们:)。
关于java - CORBA + IDL + Java : need help with writing servant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4329952/