2015-06-29 13 views
6

Vì vậy, tôi có phiên Websocket đọc thông tin từ máy chủ. Tuy nhiên nếu tôi cắt bỏ thông tin mà nó nhận được hoàn toàn, sau khoảng một phút hoặc lâu hơn nó sẽ ngừng nhận thông tin mới, và sẽ không làm bất cứ điều gì, ngay cả khi đầu ra từ máy chủ được bật lại.Phiên WebSocket đóng sau khi không nhận được đầu vào trong một thời gian

tôi nghĩ rằng phương pháp WebSocketContainer

setDefaultMaxSessionIdleTimeout(Long time) 

sẽ khắc phục vấn đề của tôi, vì vậy tôi đặt nó là

container.setDefaultMaxSessionIdleTimeout(86400000L); 

mà tôi nghĩ sẽ có nghĩa là nó sẽ tiếp tục chạy lên đến 1 ngày không hoạt động.

Tuy nhiên, đây không phải là trường hợp, nó dừng lại chỉ sau một phút không hoạt động. Dưới đây là đoạn code tôi đang sử dụng, có lẽ ai đó có thể cho tôi biết những gì tôi đang làm sai:

public void run(String... args) throws Exception { 
    log.info("Starting..."); 
    log.info("-- API URL: {}", apiUrl); 
    log.info("-- API Token: {}", apiToken); 
    WebSocketContainer container = ContainerProvider.getWebSocketContainer(); 
    container.setDefaultMaxSessionIdleTimeout(86400000L); 
    ClientEndpointConfig config = ClientEndpointConfig 
      .Builder.create() 
      .configurator(new CustomConfigurator(apiToken)) 
      .build(); 
    try { 
     session = container.connectToServer(ConsumerClient.class, config, URI.create(apiUrl)); 
    } catch (DeploymentException de) { 
     log.error("Failed to connect - DeploymentException:", de); 
    } catch (IOException ioe) { 
     log.error("IOException:", ioe); 
    } 
    if (this.session == null) { 
     throw new RuntimeException("Unable to connect to endpoint."); 
    } 

    log.info("Max Idle Timeout: " + session.getMaxIdleTimeout()); 

    log.info("Connected."); 
    log.info("Type \"exit\" to cancel."); 
    log.info("...Waiting for data..."); 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String input; 
    try { 
     do { 
      input = br.readLine(); 
      if (!input.equals("exit")) { 
       this.session.getBasicRemote().sendText(input); 
      } 
     } while (!input.equals("exit")); 
    } catch (IOException e) { 
     log.error("IOException:", e); 
    } 
} 

Tôi khá mới để WebSockets vì vậy tôi có thể hoàn toàn hiểu lầm gì đó, nhưng tôi hy vọng ai đó sẽ có thể chỉ cho tôi đúng hướng. Cảm ơn trước!

+0

2 ý tưởng, đầu tiên kiểm tra xem nó từ một môi trường khác nhau để loại trừ các vấn đề mạng cấp thấp hơn. – Remco

+0

Thứ hai: Kiểm tra với một máy chủ khác để loại trừ các vấn đề phía máy chủ, một vấn đề không có mã thông báo api. – Remco

Trả lời

0

Bạn có thể thử setMaxIdleTimeout(0) trên session không?

Theo setDefaultMaxSessionIdleTimeout tài liệu:

Các giá trị có thể được ghi đè trên cơ sở mỗi phiên sử dụng Session.setMaxIdleTimeout (dài)

+0

Tôi đã thử điều này rồi, tôi thậm chí còn in ra maxIdleTimeout của Session để xem nó có bị ghi đè ở một thời điểm nào đó không, và nó không phải. – shadowarcher

Các vấn đề liên quan