Nano Hash - криптовалюты, майнинг, программирование

Как установить время ожидания поиска JNDI на стеклянной рыбе

Из приведенного ниже кода я пытаюсь получить доступ к EJB на удаленной машине.

Код работает на Glassfish 4.1. в веб-приложении.

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)

Я не хочу ждать так долго, чтобы узнать, что поиск не удался. Все таймауты, которые я установил выше, не помогли. Как я могу установить время ожидания поиска или есть какой-либо другой обходной путь?

Спасибо.

23.08.2017

  • Вы имеете в виду время ожидания поиска JNDI? Если это так, ваш заголовок и теги неверны. 23.08.2017
  • @EJP да JNDI - спасибо - исправил. 23.08.2017

Ответы:


1

Я нашел обходной путь, используя 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();
                }               
24.08.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..