无法从org.omg.CORBA.TRANSIENT恢复(成为永久性)

时间:2014-01-29 16:52:44

标签: java corba

我想确保我的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);

即使应用程序在每次尝试执行操作时调用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>

在至少一个(可能是所有)情况下,org.omg.CORBA.TRANSIENT成为永久性之前没有org.omg.CORBA.TIMEOUT(即TIMEOUT可能是对数噪音)。

显然,因为客户端也是一个服务器,我们不希望在每次中断后重启它(并且它们确实发生了,特别是在开发环境中)。

实施是JACORB(org.jacorb.orb.ORB / org.jacorb.orb.ORBSingleton)版本2.2.4。

2 个答案:

答案 0 :(得分:0)

  1. 抓住CORBA例外并进行分析(超时?未知......?)
  2. 稍后重试或从不(但不要死)
  3. 提示:在应用程序中捕获CORBA异常是一种普遍的共识。特别是所有的网络电话。

    在拔下网络电缆时,Windows正在删除网络接口。您!必须从那些中断中恢复过来。删除网络电缆不同于一般的网络中断,例如第3层没有连接!

答案 1 :(得分:0)

有点令人尴尬的是,这真的是游泳池的一个问题,记录在这里:https://github.com/chrisvest/stormpot/issues/72

思考我在发布问题之前已经通过实验验证了汇集不是问题,为简洁起见省略了提及。有趣的是,要知道为什么这个问题得到了7个赞成票?也许还有另一个原因?