一段时间后没有收到输入后,WebSocket会话关闭

时间:2015-06-29 17:26:09

标签: java java-websocket

所以我有一个Websocket Session,它从服务器读取信息。但是,如果我切断了它完全接收到的信息,大约一分钟左右就会停止接收新信息,即使重新打开服务器的输出也不会做任何事情。

我认为是WebSocketContainer方法

setDefaultMaxSessionIdleTimeout(Long time)

会解决我的问题,所以我将其设置为

container.setDefaultMaxSessionIdleTimeout(86400000L);

我认为这意味着它将继续运行长达1天的不活动状态。

然而事实并非如此,它在一分钟不活动后就会停止。下面是我正在使用的代码,也许有人可以让我知道我做错了什么:

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

我对websockets相当新,所以我可能完全误解了一些东西,但我希望有人能够指出我正确的方向。提前谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在session上尝试setMaxIdleTimeout(0)吗?

根据setDefaultMaxSessionIdleTimeout文档:

  

可以使用Session.setMaxIdleTimeout(long)在每个会话的基础上覆盖该值