我在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
方法。