当我测试用Java编写的应用程序时,我对一个奇怪的错误感到头疼。问题出在这里:我编写了我的应用程序使用CORBA连接技术。它是一个CORBA客户端应用程序模块。在Windows环境中,事件被成功推送,但在linux(redhat和ubuntu)中却没有。但是,它非常怪异,我可以调用任何CORBA函数并准确地获取返回的数据。我调试了我的代码,发现CORBA连接和通知服务的初始化成功了。在Linux OS中,防火墙已禁用,并且端口12002未被任何应用程序使用。这里没有任何例外。所以,你能解释一下原因是什么吗?我对CORBA的经验不足。像我这样的新手这么复杂。请帮帮我!
P / S: +初始化代码如下:
Properties props = new Properties();
/*props.setProperty("borland.enterprise.licenseDefaultDir", "C:/Borland/VisiBroker/license");*/
props.setProperty("org.omg.CORBA.ORBClass", "com.inprise.vbroker.orb.ORB");
props.setProperty("org.omg.CORBA.ORBSingletonClass", "com.inprise.vbroker.orb.ORBSingleton");
props.setProperty("javax.rmi.CORBA.StubClass", "com.inprise.vbroker.rmi.CORBA.StubImpl");
props.setProperty("javax.rmi.CORBA.UtilClass", "com.inprise.vbroker.rmi.CORBA.UtilImpl");
props.setProperty("javax.rmi.CORBA.PortableRemoteObjectClass", "com.inprise.vbroker.rmi.CORBA.PortableRemoteObjectImpl");
props.setProperty("vbroker.agent.enableLocator", "false");
props.setProperty("vbroker.orb.initRef", "NotificationService=corbaloc::x.x.x.x:12002/NotificationService");
try {
System.out.println("orb = org.omg.CORBA.ORB.init(new String[0], props);");
orb = org.omg.CORBA.ORB.init(new String[0], props);
} catch (Exception e) {
System.out.println("Fail initial orb for Noti-Service.."+e);
System.exit(1);
}
try {
org.omg.CORBA.Object poa = orb.resolve_initial_references("RootPOA");
rootPoa = POAHelper.narrow(poa);
} catch (org.omg.CORBA.ORBPackage.InvalidName e) {
System.out.println("Can't get RootPOA"+ e);
System.exit(1);
}
try {
rootPoa.the_POAManager().activate();
System.out.println("rootPoa.the_POAManager().activate();");
} catch (org.omg.PortableServer.POAManagerPackage.AdapterInactive ex) {
System.out.println("Can't activate POAManager"+ex);
System.exit(1);
}
Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownHook(orb)));
Thread thread = new Thread() {
public void run() {
orb.run();
}
};
thread.setName("OpenFusion ORB thread");
thread.start();
方法getObject():
private StructuredPushConsumer getObject(){ StructuredPushConsumer serverObj = null;
org.omg.PortableServer.Servant servant = new StructuredPushConsumerPOATie(this, rootPoa);
try {
org.omg.CORBA.Object ref = rootPoa.servant_to_reference(servant);
serverObj = StructuredPushConsumerHelper.narrow(ref);
} catch (ServantNotActive e) {
System.out.println("Unexpected Exception: "+e);
System.exit(1);
} catch (WrongPolicy e) {
System.out.println("Unexpected Exception: "+e);
System.exit(1);
}
return serverObj;
}
connect()方法:
public void connect() {
/* Defines the type of proxy required */
ClientType ctype = ClientType.STRUCTURED_EVENT;
/* Holder to hold the proxy id */
org.omg.CORBA.IntHolder pid = new org.omg.CORBA.IntHolder();
/* Proxy supplier variable */
ProxySupplier proxySupplier = null;
/* Obtain the consumer admin object reference */
ConsumerAdmin admin = channel.default_consumer_admin();
try {
/* obtain a structured push supplier object reference. */
proxySupplier = ((ConsumerAdminOperations) admin).obtain_notification_push_supplier(ctype, pid);
System.out.println("proxySupplier = ((ConsumerAdminOperations) admin).obtain_notification_push_supplier(ctype, pid);");
} catch (AdminLimitExceeded ex) {
/*
* Thrown if the admin object is unable to have any more proxy suppliers associated with it.
*/
System.err.println("Maximum number of proxies exceeded!");
System.exit(1);
}
/* Narrow the proxy supplier to a Structured Proxy Push Supplier */
proxy = StructuredProxyPushSupplierHelper.narrow(proxySupplier);
try {
/* connect the consumer to the proxy */
proxy.connect_structured_push_consumer(getObject());
System.out.println("proxy.connect_structured_push_consumer(getObject());");
} catch (AlreadyConnected e) {
/*
* This exception is thrown if a consumer is already connected to this proxy. This should not be thrown because the proxy has just been created.
*/
System.err.println("Already connected!");
System.exit(1);
} catch (TypeError e) {
/*
* This exception is thrown if you attempt to connect a sequenced consumer to a structured proxy or vice versa.
*/
System.err.println("Type error!");
System.exit(1);
}
}
disconnect()方法:
public void disconnect() {
if (proxy != null) {
System.out.println("Disconnected!");
}
}
答案 0 :(得分:0)
我认为你的对象激活缺失了。可能是在这个poitn中没有完全定义ORB行为,所以你在这里使用更明确的激活。
// create TIE
StructuredPushConsumerPOATie pushConsumer =
new StructuredPushConsumerPOATie(this, rootPoa);
// activate object (may work without that)
rootPoa.activate_object(pushConsumer);
try {
// implicit activation
org.omg.CORBA.Object ref = pushConsumer._this_object();
serverObj = StructuredPushConsumerHelper.narrow(ref);
}
答案 1 :(得分:0)
也许这不是SW相关问题,而是硬件/网络。
如果您使用多主机(多个网卡/接口),则应指定接收CORBA通知的IP地址。
查看您的属性文件。 我使用了JacOrb,所以文件是 etc \ jacorb.properties ,属性如下 的 OAAddress = IIOP://1.2.3.4:4711 强>