2017-08-23 3 views
0

Du code ci-dessous j'essaie d'accéder à EJB sur une machine distante.Comment régler le délai de recherche JNDI sur glassfish

Le code fonctionne sur Glassfish 4.1. dans une application 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"); 

Si la recherche aboutit, tout fonctionne correctement.

Cependant, le problème est que si la machine distante n'est pas disponible, le code se bloque ctx.lookup("ejbname#EjbName");. Le temps est différent sur la cause, pour plus 1 min 20 seconds si l'IP est inexistante et plus 10 minutes si la machine distante est derrière un pare-feu jusqu'à ce qu'il jette rechercher exception d'échec:

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) 

Et est une autre cause ici:

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) 

Je ne veux pas attendre si longtemps pour découvrir que la recherche a échoué. Tous les délais d'attente que j'ai définis ci-dessus n'ont pas aidé. Comment puis-je définir un délai d'attente de recherche ou existe-t-il une autre solution de contournement?

Merci.

+0

Voulez-vous dire ** JNDI ** lookout timeout? Si oui, votre titre et vos tags sont incorrects. – EJP

+0

@EJP oui JNDI - merci - l'a corrigé. – Plirkee

Répondre

0

J'ai trouvé une solution de contournement, en utilisant concurrent.Future de Java.

  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(); 
       }