在PlayFramework中关闭WSCLIENT的问题



我在playframework中的WSClient有问题。

当我发送请求关闭WSCLIENT的最终块时:

 public WSResponse sendPostRequest(String url, String bodyAsJson,  Map<String,List<String>> headers) throws Exception {
        WSResponse response;
        CompletionStage<WSResponse> wsResponseCompletionStage;
        try {
            //Headers
            WSRequest request = ws.url(url);
            request = mapHeaderParams(headers, request);
            //sending request to api......
            wsResponseCompletionStage = request.post(bodyAsJson);
            request.getHeaders().put("Authorization", Arrays.asList("Basic "+ "xyz"));
            response = wsResponseCompletionStage.toCompletableFuture().get();
            logger.debug("Response Data from Api : " + response.getBody());
        } catch (Exception e) {
            logger.error("Error Posting Data to Api : " + e.getMessage());
            ws.close();
            throw e;
        }finally {
            ws.close();
        }
        return response;
    }

当我想发送下一个请求时,我总是会遇到错误:

java.lang.illegalstateException:封闭

..当我不关闭WS客户端时,它会不断登录我的应用程序。

调试] O.A.N.C.DefaultChannelpool-关闭0连接1 in 0 in 0 MS [debug] O.A.N.C.DefaultChannelPool-条目计数: https://api.com:443:1 [debug] O.A.N.C.DefaultChannelpool- 封闭的0连接在1 in 0 ms [debug]中的1个连接 O.A.N.C.DefaultChannelPool-条目计数: https://api.com:443:1 [debug] O.A.N.C.DefaultChannelpool- 封闭的0连接在1 in 0 ms

..所以wsclient永远不会关闭!

这是我的网络客户类:

@Singleton
public class ApiRequestClient{
    @Inject
    private WSClient ws;
    final Logger.ALogger logger = Logger.of(this.getClass());
    @Inject
    public ApiRequestClient(WSClient ws) {
        this.ws = ws;
    }

    public WSRequest mapHeaderParams(Map<String, List<String>> headers, WSRequest request) {
        //not working !!!! ....
        //request.getHeaders().putAll(headersa);
        //thats why we do ......
        Set keySet = headers.keySet();
        for(Object key : keySet){
            request.setHeader(key.toString(), headers.get(key).get(0));
        }
        return request;
    }

    public WSResponse sendPostRequest(String url, String bodyAsJson,  Map<String,List<String>> headers) throws Exception {
        WSResponse response;
        CompletionStage<WSResponse> wsResponseCompletionStage;
        try {
            //Headers
            WSRequest request = ws.url(url);
            request = mapHeaderParams(headers, request);
            //sending request to api......
            wsResponseCompletionStage = request.post(bodyAsJson);
            //FIXME !!!!
            request.getHeaders().put("Authorization", Arrays.asList("Basic "+ "xyz"));
            response = wsResponseCompletionStage.toCompletableFuture().get();
            logger.debug("Response Data from Api : " + response.getBody());
        } catch (Exception e) {
            logger.error("Error Posting Data to Api : " + e.getMessage());
            ws.close();
            throw e;
        }finally {
            ws.close();
        }
        return response;
    }
    public static Map<String, String> queryStringToParameterMap(Map<String, String[]> queryString) {
        Map<String, String> params = new HashMap<String, String>();
        Set<String> keys = queryString.keySet();
        for (String key : keys) {
            params.put(key, queryString.get(key)[0]);
        }
        return params;
    }
}

任何人都知道这种奇怪的行为??

很多

您无需在每次通话后手动关闭WSClient,直到使用依赖项注入为止。Play将在启动时处理它的创建,并在自动关闭时清理它。这是通过在应用程序停止挂钩上订阅的AHCWSMODULE完成的。

如文档中所述,您需要在手动创建WSClient时才调用close方法。

最新更新