Java的'tnameserv'需要3分钟以上才能“准备就绪”,为什么呢?

我试图帮助一个应用程序的开发,我想在Linux上使用Corba服务器来解决问题。 我把这个问题缩小了3分钟,以便在调用之后做好准备。

tnameserv在3分钟内试图做什么,无论如何我可以加快速度? 应用程序失败,因为它试图在重试之间进行5次连接尝试,间隔1秒; 这显然没有给tserverserv足够的时间做好准备。 我在Slackware 13.0上使用Java 6u17

如果重要的话。 tnameserv的实际调用如下:

 tnameserv -ORBInitialPort 23423 

在shell中运行该命令时,它似乎挂起,直到3分钟左右,我终于看到它显示“就绪”。

UPDATE

我做了一个strace -f tnameserv -ORBInitialPort 23423 ,我看到了gettimeofday(),clock_gettime()和futex()的调用,后者总是返回'-1 ETIMEDOUT(Connection timed out)。 我有一种感觉,这是与我的问题有关,但我不知道如何或为什么。

这只是我从strace中看到的一小部分。 有人可以复制和/或理解这个吗?

 [pid 30950] futex(0x8128e14,FUTEX_WAIT_PRIVATE,1,{0,49903084})= -1 ETIMEDOUT(连接超时)
 [pid 30950] futex(0x8098a28,FUTEX_WAKE_PRIVATE,1)= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329619,995857482})= 0
 [pid 30950] gettimeofday({1260930158,92108},NULL)= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329619,995996617})= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329619,996088536})= 0
 [pid 30950] gettimeofday({1260930158,92328},NULL)= 0
 [pid 30950] clock_gettime(CLOCK_REALTIME,{1260930158,92424295})= 0
 [pid 30950] futex(0x8128e14,FUTEX_WAIT_PRIVATE,1,{0,49903705})= -1 ETIMEDOUT(连接超时)
 [pid 30950] futex(0x8098a28,FUTEX_WAKE_PRIVATE,1)= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329620,46761098})= 0
 [pid 30950] gettimeofday({1260930158,143084},NULL)= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329620,46913924})= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329620,47006961})= 0
 [pid 30950] gettimeofday({1260930158,143303},NULL)= 0
 [pid 30950] clock_gettime(CLOCK_REALTIME,{1260930158,143398317})= 0
 [pid 30950] futex(0x8128e14,FUTEX_WAIT_PRIVATE,1,{0,49904683})= -1 ETIMEDOUT(连接超时)
 [pid 30950] futex(0x8098a28,FUTEX_WAKE_PRIVATE,1)= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329620,97818379})= 0
 [pid 30950] gettimeofday({1260930158,194127},NULL)= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329620,97957235})= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329620,98049154})= 0
 [pid 30950] gettimeofday({1260930158,194346},NULL)= 0
 [pid 30950] clock_gettime(CLOCK_REALTIME,{1260930158,194441349})= 0
 [pid 30950] futex(0x8128e14,FUTEX_WAIT_PRIVATE,1,{0,49904651})= -1 ETIMEDOUT(连接超时)
 [pid 30950] futex(0x8098a28,FUTEX_WAKE_PRIVATE,1)= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329620,148806370})= 0
 [pid 30950] gettimeofday({1260930158,245055},NULL)= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329620,148947182})= 0
 [pid 30950] clock_gettime(CLOCK_MONOTONIC,{329620,148981547})= 0
 [pid 30950] gettimeofday({1260930158,245280},NULL)= 0
 [pid 30950] clock_gettime(CLOCK_REALTIME,{1260930158,245374859})= 0
 [pid 30950] futex(0x8128e14,FUTEX_WAIT_PRIVATE,1,{0,49905141})= -1 ETIMEDOUT(连接超时)

我无法直接解决您的问题,但是经验告诉我,经常会有三五分钟的无法解释的延迟是等待DNS超时的结果。

你的configuration是否通过主机名来调用任何东西?

原来问题是防火墙问题。 Wireshark没有显示任何有用的信息,因为防火墙正在丢弃某个数据包。 尽pipe我看了几次防火墙日志,以确定情况并非如此,但事实certificate,我并没有find正确的位置。 我忽略了这个“tnameserv”是IPv6认识的事实(因为它是绑定到::: 23423),粗略地看了一下我的防火墙脚本,发现我将IPv6相关的数据包logging到与IPv4数据包不同的位置。 这不是一个疏忽,但必须完成,因为ip6tables目前不支持-jULOG目标。

长话短说,允许IPv6回环固定的问题,“tnameserv”几乎立即返回“就绪”。