2015-02-16 2 views
2

У меня есть приложение Java, которое подключается к удаленному серверу веб-сервера. Как клиент, я использую стандартный Java EE JSR356 WebSocket API:Тайм-аут соединения с использованием стандартного клиента JSR356 WebSocket

javax.websocket.WebSocketContainer.connectToServer(...) 

Однако я не нашел способ указать тайм-аут соединения, используя этот API. Когда я вызываю метод connectToServer (...), он блокируется до тех пор, пока не установит соединение (чего, возможно, никогда не произойдет).

Есть ли способ указать время ожидания соединения с использованием стандартного API? Если нет, есть ли способы обхода?

ответ

3

К сожалению, это не отображается JSR 356 - WebSocket API for Java. Вам нужно будет использовать функцию реализации, такую ​​как HANDSHAKE_TIMEOUT в Tyrus (эталонная реализация). Другие реализации, скорее всего, будут иметь что-то подобное.

Похоже, что еще нет билетов об этом еще в WEBSOCKET_SPEC, поэтому вы можете добавить его, если хотите (я смог найти только проблему, которая упоминает свойства SSL - WEBSOCKET_SPEC-210).

+1

Tnx за ответ, я создал проблему JIRA для этого: https://java.net/jira/browse/WEBSOCKET_SPEC-234 –

-1

Только что это работало. Если вы вызываете connectToServer через конструкцию Future, вы можете использовать таймаут в методе get().

Вам потребуется ThreadPool:

private final ExecutorService pool = Executors.newFixedThreadPool(10); 

Вот функция:

private Future<Session> asyncConnectToServer(Object annotatedEndpointInstance, URI uri) { 
     return pool.submit(new Callable<Session>() { 
      @Override 
      public Session call() throws Exception { 
       try { 
        WebSocketContainer container = ContainerProvider.getWebSocketContainer(); 
        return(container.connectToServer(annotatedEndpointInstance, uri)); 
       } catch (DeploymentException | IOException | IllegalStateException e) { 
        //throw new RuntimeException(e); 
        return(null); 
       } 
      } 
     }); 
    } 

И это, как вы это называете:

public webSocketClientEndpoint(URI endpointURI, long timeout) { 

     final Future<Session> futureSes = asyncConnectToServer(this, endpointURI); 

     try {    
      Session ses = futureSes.get(timeout, TimeUnit.MILLISECONDS); 
     } catch(InterruptedException | ExecutionException | TimeoutException e) { 
      System.out.println("Time out..."); 
     } 
    } 

Ref: https://dzone.com/articles/javautilconcurrentfuture

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#get(long,%20java.util.concurrent.TimeUnit)

+0

Ссылка на потенциальное решение всегда приветствуется, но пожалуйста [добавить контекст по ссылке] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers/8259#8259), поэтому ваши друзья-пользователи будут иметь некоторые идея, что это такое и почему она есть. Всегда указывайте наиболее значимую часть важной ссылки, если целевой сайт недоступен или постоянно находится в автономном режиме. Учтите, что это всего лишь ссылка на внешний сайт - это возможная причина [Почему и как удаляются некоторые ответы?] (Http://stackoverflow.com/help/deleted-answers). – FelixSFD

Смежные вопросы