6

サーバーから情報を読み取る Websocket セッションがあります。しかし、受信している情報を完全に遮断すると、1分ほどで新しい情報の受信が停止し、サーバーからの出力をオンにしても何もしなくなります。

私は WebSocketContainer メソッド

setDefaultMaxSessionIdleTimeout(Long time)

私の問題を解決するので、私はそれを

container.setDefaultMaxSessionIdleTimeout(86400000L);

これは、非アクティブな状態が 1 日続くことを意味すると考えました。

ただし、これは当てはまりません。非アクティブ状態が 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);
    }
}

私はウェブソケットにかなり慣れていないので、何かを完全に誤解しているかもしれませんが、誰かが私を正しい方向に向けることができることを願っています. 前もって感謝します!

4

1 に答える 1

1

でsetMaxIdleTimeout(0)を試すことができますsessionか?

setDefaultMaxSessionIdleTimeoutドキュメントによると:

Session.setMaxIdleTimeout(long) を使用して、セッションごとに値をオーバーライドできます。

于 2015-07-09T05:17:23.273 に答える