我开发了一个独立的Javase客户端,它对远程服务器执行EJB查找并执行其方法。服务器应用程序在EJB 3.0中
在一些奇怪的神奇但罕见的情况下,我的程序不确定地挂起,在查看问题时,似乎在查找服务器上的ejb时,我从来没有从服务器获得响应,它也永远不会超时。
我想知道是否有属性或任何其他方式我们可以在客户端或服务器端设置查找时间。
答案 0 :(得分:1)
有一篇非常好的文章讨论了DeveloperWorks here的ORB配置最佳实践。我引用了可以在客户端配置的三种不同设置(您在执行查找和在远程服务器上执行方法时);
连接超时:在客户端ORB甚至可以向服务器发送请求之前,它需要建立IIOP连接(或重新使用 现有的)。一般情况下,IIOP和底层TCP 连接操作应该非常快。然而,争论 网络或其他不可预见的因素可能会减慢这种速度。该 默认连接超时是无限期的,但是ORB自定义属性
com.ibm.CORBA.ConnectTimeout
(以秒为单位)可用于更改 超时。查找请求超时:一旦建立连接并且客户端向服务器发送RMI请求,则LocateRequestTimeout 可用于限制CORBA LocateRequest(CORBA)的时间 “ping”)为对象。因此,LocateRequestTimeout应该 小于或等于RequestTimeout,因为它很多 在来回发送的数据方面的操作更短。像 RequestTimeout,LocateRequestTimeout默认为180秒。
请求超时:一旦客户端ORB与服务器建立了TCP连接,它就会发送请求。但是,它 不会无限期地等待响应,默认情况下它会等待 180秒这是ORB请求超时间隔。这个可以 通常会降低,但应符合预期 来自服务器的应用程序响应时间。
答案 1 :(得分:0)
您可以尝试以下代码,执行任务&然后最多等待指定的时间。
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)
可以取消该任务。
答案 2 :(得分:0)
远程JNDI使用ORB,因此唯一可用的选项是com.ibm.CORBA.RequestTimeout
,但这会对所有远程调用产生影响。如7.0 InfoCenter中所述,默认值为180(3分钟)。