如何在glassfish上设置JNDI查找超时
问题描述:
从下面的代码我试图访问远程计算机上的EJB。如何在glassfish上设置JNDI查找超时
该代码在Glassfish 4.1上运行。在Web应用程序中。
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("org.omg.CORBA.ORBInitialHost","X.X.X.X");
props.setProperty("org.omg.CORBA.ORBInitialPort","3700");
//timeouts
props.setProperty("sun.rmi.transport.connectionTimeout","5000");
props.setProperty("sun.rmi.transport.tcp.handshakeTimeout","5000");
props.setProperty("sun.rmi.transport.tcp.responseTimeout","5000");
props.setProperty("sun.rmi.transport.tcp.readTimeout","5000");
props.setProperty("com.sun.corba.ee.transport.ORBWaitForResponseTimeout","5000");
props.setProperty("com.sun.corba.ee.transport.ORBTCPConnectTimeouts", "100:500:100:500");
props.setProperty("com.sun.corba.ee.transport.ORBTCPTimeouts", "500:2000:50:1000");
System.setProperty("com.sun.corba.ee.transport.ORBWaitForResponseTimeout","5000");
System.setProperty("com.sun.corba.ee.transport.ORBTCPConnectTimeouts","100:500:100:500");
System.setProperty("com.sun.corba.ee.transport.ORBTCPTimeouts","500:2000:50:1000");
System.setProperty("sun.rmi.transport.connectionTimeout","5000");
System.setProperty("sun.rmi.transport.tcp.handshakeTimeout","5000");
System.setProperty("sun.rmi.transport.tcp.responseTimeout","5000");
System.setProperty("sun.rmi.transport.tcp.readTimeout","5000");
//timeout
InitialContext ctx = new InitialContext(props);
MyRemoteInterface bean = (MyRemoteInterface)
ctx.lookup("ejbname#EjbName");
如果查找成功 - 一切正常。
但是,问题是,如果远程机器不可用,则代码将挂起ctx.lookup("ejbname#EjbName");
。的时间不同,原因,超过1 min 20 seconds
如果IP是不存在的,并在10 minutes
如果远程计算机是在防火墙后面,直到它引发查找失败例外:
Severe: org.omg.CORBA.COMM_FAILURE: FINE: 00410001: Connection failure:
...
...
Caused by: java.nio.channels.UnresolvedAddressException
at sun.nio.ch.Net.checkAddress(Net.java:101)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:622)
at com.sun.corba.ee.impl.misc.ORBUtility.openSocketChannel(ORBUtility.java:110)
at org.glassfish.enterprise.iiop.impl.IIOPSSLSocketFactory.createSocket(IIOPSSLSocketFactory.java:329)
这里有另外一个原因:
Caused by: java.net.ConnectException: Connection timed out: connect
at sun.nio.ch.Net.connect0(Native Method)
at sun.nio.ch.Net.connect(Net.java:454)
at sun.nio.ch.Net.connect(Net.java:446)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:648)
at com.sun.corba.ee.impl.misc.ORBUtility.openSocketChannel(ORBUtility.java:110)
at org.glassfish.enterprise.iiop.impl.IIOPSSLSocketFactory.createSocket(IIOPSSLSocketFactory.java:329)
我不想等那么久才发现查找失败。我上面设置的所有超时都没有帮助。如何设置查找超时或是否有其他解决方法?
谢谢。
答
我发现了一个解决方法,使用java的concurrent.Future
。
MyRemoteInterface bean;
java.util.concurrent.Future <Object> future;
java.util.concurrent.ExecutorService executorService = java.util.concurrent.Executors.newFixedThreadPool(1);
future = executorService.submit(new java.util.concurrent.Callable<Object>() {
public Object call() throws Exception {
return ctx.lookup("ejbname#EjbName");
}
});
try {
bean = (MyRemoteInterface) future.get(2L, java.util.concurrent.TimeUnit.SECONDS);
} catch (java.util.concurrent.ExecutionException ex) {
ex.printStackTrace();
throw ex;
}
catch (InterruptedException ee){
ee.printStackTrace();
throw ee;
}
catch (TimeoutException te){
throw new Exception("Time Out!");
}
finally {
future.cancel(true);
executorService.shutdown();
}
您的意思是** JNDI **查找超时?如果是这样,你的标题和标签不正确。 – EJP
@EJP是的JNDI - 谢谢 - 修正它。 – Plirkee