假设我创建了以下IDL文件:
module ProviderTest {
interface Multiplier {
long twice(in long number);
};
interface MultiplierProvider {
Multiplier get();
};
};
以后能够在客户端执行这样的调用(在Java中):
MultiplierProvider provider = /* obtain a stub form ORB */
Multiplier multiplier = provider.get();
int four = multiplier.twice(2);
Java IDL编译器为该IDL生成代码而没有抱怨,但是我在编写MultiplierProvider
servant的实现时遇到了麻烦。它的get()
方法的返回类型为Multiplier
,这是一个生成的接口。为了实现MultiplierProvider
,我扩展了MultiplierProviderPOA
,但我没有Multiplier
的合适实现类,因此我无法实现get()
方法。
通常(如果没有从MupltiplierProvider引用Multiplier),在服务器端我会扩展MultiplierPOA
(生成的类),然后通过命名服务发布它。
问题MultiplierPOA
没有实现Multiplier
接口,因此无法从MultiplierProvider.get()
返回实例。
我在这里遗漏了一些基本原则,你不能用CORBA IDL做这样的事情(或者说Java的IDL支持不能处理这种情况)?如果这样的接口可以实现 - 实现如何工作?
答案 0 :(得分:1)
这是可能的。在C ++中,您将从MultiplierPOA
创建派生类并创建它的实例。然后,您将使用_this()
成员函数返回对象引用,并可能激活默认POA上的服务方(如果之前尚未激活)。
粗略的C ++:
MyMultiplierPOA_ptr servant = new MyMultiplierPOA();
Multiplier_ptr object_ref = servant->_this(); // activate & create object reference
return object_ref; // return to caller
我遗漏了一些神秘的IDL到C ++映射废话(例如_duplicate
和_var
的东西,所以我不会让你感到困惑。)
我意识到你想要一个Java答案,但也许这会有所帮助。我假设IDL到Java映射提供了与_this()
类似的机制。您可能想咨询IDL to Java mapping document on the OMG website。简而言之,它看起来似乎支持_this()
方法。
答案 1 :(得分:0)
最近我找到了一个适合我的解决方案。因此,为了获得类型Multiplier
的引用,可以从MultiplierPorider.get()
方法返回,可以创建从MultiplierPOA
派生的类的实例,然后将其注册到ORB同时从ORB获取存根,然后可以从get()
方法返回。这是代码:
MultiplierImpl servant = new MultiplierImpl();
POA rootPOA = /* obtain a reference to the Root Object Adapter from the ORB */
/* get a reference of type Multiplier:
register the servant with POA and get a stub for it */
Multiplier multiplier = MultiplierHelper.narrow(rootPOA.servant_to_reference(servant));
/* construct the MultiplierProvider servant passing the stub to it */
MultiplierProviderImpl provider = new MultiplierProviderImpl(multiplier);
/* then register provider in Naming Context, so it can be obtained by the client using the name */
我还检查过,在以这种方式注册servant之后,可以使用以下代码来获取对stub的引用(感谢this answer):
/* method _this() is defined in MultiplierPOA */
Multiplier stub = servant._this();
虽然实现看似微不足道,但为了清楚起见,MultiplierProviderImpl类可能看起来像这样:
public class MultiplierProviderImpl extends MultiplierProviderPOA {
private final Multiplier multiplier;
public MultiplierProviderImpl(Multiplier multiplier) {
this.multiplier = multiplier;
}
@Override
public Multiplier getMultiplier() {
return multiplier;
}
}
,MultiplierImpl看起来像这样:
public class MultiplierImpl extends MultiplierPOA {
@Override
public void twice(int number) {
return number * 2;
}
}