我想确保我的CORBA客户端能够适应中断,我让客户端工作,并通过Windows中的网络适配器禁用来测试弹性.CORBA连接显然失败,并且功能不可用,但是当再次启用适配器时它不会恢复.ORB.init再次调用,但我继续得到相同的错误.
似乎在org.omg.CORBA.TRANSIENT抛出后会保留一些静态状态,导致客户端报告网络连接超时,即使问题已完全解决.只有重新启动进程(dropwizard runnable JAR)才能让客户端再次运行.
这是启动ORB的代码:
String[] orbInits = {"-ORBInitRef", orbInitRef};
Properties properties = new Properties() {
{
setProperty("org.omg.CORBA.ORBClass", orbClass);
setProperty("org.omg.CORBA.ORBSingletonClass", orbSingletonClass);
setProperty("jacorb.connection.client.connect_timeout", "" + connectionTimeout);
}
};
return ORB.init(orbInits, properties);
Run Code Online (Sandbox Code Playgroud)
即使应用程序在每次尝试执行操作时调用ORB.init(即关闭ORB池),问题仍然存在.
客户端在中断场景中抛出的错误包括:
org.omg.CORBA.TIMEOUT: connection timeout of 2000 milliseconds expired
org.omg.CORBA.TRANSIENT: Retries exceeded, couldn't reconnect to <IP>:<PORT>
Run Code Online (Sandbox Code Playgroud)
在至少一个(可能是所有)情况下,在org.omg.CORBA.TRANSIENT成为永久性之前没有org.omg.CORBA.TIMEOUT (即TIMEOUT可能是对数噪声).
显然,因为客户端也是一个服务器,我们宁愿不必在每次中断后重新启动它(并且它们确实发生了,特别是在开发环境中).
实现是JACORB(org.jacorb.orb.ORB/org.jacorb.orb.ORBSingleton)版本2.2.4.
提示:在应用程序中捕获 CORBA 异常是普遍共识。尤其是网络通话方面。
当拔掉网络电缆时,Windows 正在删除网络接口。你!必须从这些中断中恢复过来。拔掉网线与一般的网络中断不同,就像第三层没有连接一样!