Закрыть поток и воссоздать WebSocket, при ошибке - PullRequest
0 голосов
/ 04 октября 2018

Я хочу установить WebSocket с помощью AsyncHttpClient.Но в случае ошибки я хочу воссоздать новый WebSocket.Но выполнение этого ниже создает другой поток, и мой предыдущий поток остается открытым и работает (проверил это с помощью Memory Analyzer).Как я могу остановить эту тему?

private static Map<String, Integer> errorNo =  new HashMap<String, Integer>();
private static Map<String,CompletableFuture<NettyWebSocket>> completableFutures=  new HashMap<String,CompletableFuture<NettyWebSocket>>(); 
private static final int maxTry = 2;

        @Bean
        @Scope("prototype")
        public CompletableFuture<NettyWebSocket> connect2(String webSocketPath) {
            completableFutures.put(webSocketPath,Dsl.asyncHttpClient()
                    .prepareGet(webSocketPath)
                    .addHeader("Accept", application_json)
                    .execute(webSocketUpgradeHandler(webSocketPath))
                    .toCompletableFuture()
                    .exceptionally(ex -> {
                        return null;
                    }) );
            return completableFutures.get(webSocketPath);
        }

    @Bean
    @Scope("prototype")
    public WebSocketListener webSocketTextListener(String webSocketPath) {

        return new WebSocketListener() {

            @Override
            public void onOpen(WebSocket websocket) {
                logger.info("webSocket opened, path " + websocket.getRemoteAddress() +", " +Thread.currentThread());
            }

            @Override
            public void onClose(WebSocket websocket, int code, String reason) {
                logger.info("webSocket closed, path "  + websocket.getRemoteAddress());
            }

            @Override
            public void onError(Throwable t){
                //i want to close this thread and retry again
                errorNo.put(webSocketPath,errorNo.get(webSocketPath)==null?1:errorNo.get(webSocketPath)+1);
                logger.info("webSocket error, " +webSocketPath+", error No -"+errorNo.get(webSocketPath));
                if(errorNo.get(webSocketPath)<=maxTry) {
                    logger.info("retrying, " +webSocketPath+", try No-"+errorNo.get(webSocketPath));
                    context.getBean("connect",webSocketPath);
                }
            }


            @Override
            public void onTextFrame(String payload, boolean finalFragment, int rsv) {
                }
            }
        };
    }
...