Проблема закрытия WSClient в Playframework - PullRequest
0 голосов
/ 19 декабря 2018

У меня проблема с 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: Closed

.. и когда я не закрываю свой ws-клиент, он постоянно регистрируется в моем приложении.Журналы, подобные этому, и не останавливают его вообще:

debug] oancDefaultChannelPool - Закрыто 0 соединений из 1 в 0 мс [debug] oancDefaultChannelPool - Количество записей для: https://api.com:443: 1 [debug] oancDefaultChannelPool - закрыты 0 соединений из 1 в 0 мс [debug] oancDefaultChannelPool - счетчик записей для: https://api.com:443: 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;
    }

}

Кто-нибудь знает это странное поведение ??

THX много

1 Ответ

0 голосов
/ 19 декабря 2018

Вам не нужно закрывать WSClient вручную после каждого вызова, пока вы не используете внедрение зависимостей.Play запустит процесс создания при запуске и автоматически очистит его при завершении работы.Это делается в AhcWSModule путем подписки на приложение stop hook .

Вам необходимо вызывать close метод только при создании WSClient вручную, как описано в документация .

...