Проблема закрытия WSClient в Playframework
У меня есть проблема с WSClient в playframework.
Когда я отправляю запрос, закрывающий WSClient в блоке finally после:
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-клиент, он постоянно входит в мои application.logs вот так и вообще не останавливает его:
debug] oancDefaultChannelPool - закрыты 0 соединений из 1 за 0 мс [debug] oancDefaultChannelPool - счетчик записей для: https://api.com/: 1 [debug] oancDefaultChannelPool - закрыты 0 соединений из 1 за 0 мс [debug] oancDefaultChannelPool - Количество записей для: https://api.com/: 1 [debug] oancDefaultChannelPool - Закрыто 0 соединений из 1 за 0 мс
.. так что WSClient никогда не закрывается!
Вот мой класс WebClient:
@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;
}
}
Кто-нибудь знает это странное поведение?
большое спасибо
1 ответ
Вам не нужно закрывать WSClient
вручную после каждого вызова, пока вы не используете внедрение зависимостей. Play запустит процесс создания при запуске и автоматически очистит его при завершении работы. Это делается в AhcWSModule путем подписки на остановку приложения.
Вам нужно позвонить close
метод только при создании WSClient
вручную, как описано в документации.