我开发了一个独立的 Javase 客户端,它对远程服务器执行 EJB 查找并执行其方法。服务器应用程序在 EJB 3.0 中
在一些奇怪的神奇但罕见的情况下,我的程序无限期地挂起,在查看问题内部时,似乎在服务器上查找 ejb 时,我从未得到服务器的响应,它也从未超时。
我想知道是否有一个属性或任何其他方式可以通过它在客户端或服务器端设置查找时间。
我开发了一个独立的 Javase 客户端,它对远程服务器执行 EJB 查找并执行其方法。服务器应用程序在 EJB 3.0 中
在一些奇怪的神奇但罕见的情况下,我的程序无限期地挂起,在查看问题内部时,似乎在服务器上查找 ejb 时,我从未得到服务器的响应,它也从未超时。
我想知道是否有一个属性或任何其他方式可以通过它在客户端或服务器端设置查找时间。
有一篇非常好的文章在此处讨论了 DeveloperWorks中的 ORB 配置最佳实践。我引用了可以在客户端配置的三种不同设置(您在远程服务器上进行查找和执行方法时);
连接超时:在客户端 ORB 甚至可以向服务器发送请求之前,它需要建立 IIOP 连接(或重新使用现有的连接)。在正常情况下,IIOP 和底层 TCP 连接操作应该会很快完成。但是,网络上的争用或其他不可预见的因素可能会减慢这一速度。默认连接超时是不确定的,但 ORB 自定义属性
com.ibm.CORBA.ConnectTimeout
(以秒为单位)可用于更改超时。定位请求超时:一旦建立连接并且客户端向服务器发送 RMI 请求,则 LocateRequestTimeout 可用于限制对象的 CORBA LocateRequest(CORBA“ping”)时间。因此,LocateRequestTimeout 应该小于或等于 RequestTimeout,因为就来回发送的数据而言,它是一个更短的操作。与 RequestTimeout 一样,LocateRequestTimeout 默认为 180 秒。
Request timeout: Once the client ORB has an established TCP connection to the server, it will send the request across. However, it will not wait indefinitely for a response, by default it will wait for 180 seconds. This is the ORB request timeout interval. This can typically be lowered, but it should be in line with the expected application response times from the server.
您可以尝试以下代码,它执行任务然后最多等待指定的时间。
Future<Object> future = executorService.submit(new Callable<Object>() {
public Object call() {
return lookup(JNDI_URL);
}
});
try {
Object result = future.get(20L, TimeUnit.SECONDS); //- Waiting for at most 20 sec
} catch (ExecutionException ex) {
logger.log(LogLevel.ERROR,ex.getMessage());
return;
}
此外,该任务可以通过 取消future.cancel(true)
。
远程 JNDI 使用 ORB,因此唯一可用的选项是com.ibm.CORBA.RequestTimeout
,但这将对所有远程调用产生影响。如7.0 InfoCenter中所述,默认值为 180(3 分钟)。