我已经设置了AWS WebSocket API并创建了Lambda方法(Python 3.9):onConnect、onSendMessage和onDisconnect。然后我创建了一个与服务器通信的java应用程序。我正在使用OKHTTP客户端。
我设置了一个pingInterval来保持连接。在最后的应用程序中,这将是300秒,但为了加快测试速度,我将其设置为10秒。一切都很完美。我可以连接、发送消息、断开连接,所有这些都可以在CloudWatch中跟踪。但是,当我使用此方法连接,然后关闭设备中的互联网连接时,会调用onFailure,并显示消息:“错误:发送了ping,但在10000ms内没有收到pong(在1次成功ping/pong之后)”。问题是AWS WebSocket API不调用onDisconnect方法,并且我在CloudWatch中找不到任何发生了失败的ping/pong活动的迹象。如何使AWS WebSocket API知道连接已关闭(以这样的方式,我可以获取连接ID并对其进行处理)?
OkHttpClient client;
WebSocket ws;
private void start_web_socket() {
    client = new OkHttpClient.Builder()
                    .pingInterval(10, TimeUnit.SECONDS)
                    .build();
    String url = "wss://myweb_socket_address";
    Request request = new Request.Builder()
                    .url(url)
                    .build();
    WebSocketEcho listener = new WebSocketEcho();
    ws = client.newWebSocket(request, listener);
    client.dispatcher().executorService().shutdown();
}
public class WebSocketEcho extends WebSocketListener {
    private static final int NORMAL_CLOSURE_STATUS = 1000;
    @Override
    public void onOpen(WebSocket webSocket, Response response) {
        System.out.println("Connection open : " + response.toString());
    }
    @Override
    public void onMessage(WebSocket webSocket, String text) {
        System.out.println("Receiving : " + text);
    }
    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
        System.out.println("Receiving bytes : " + bytes.hex());
    }
    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
        webSocket.close(NORMAL_CLOSURE_STATUS, null);
        System.out.println("Closing : " + code + " / " + reason);
    }
    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
        System.out.println("Error : " + t.getMessage());
    }
}