Вызывают ли эти параллельные запросы отказоустойчивый сервис? - PullRequest
0 голосов
/ 24 сентября 2018

Я использую Future Callable для одновременного вызова следующего метода.И я получил исключение «java.io.IOException: сервер возвратил код ответа HTTP: 502 для URL», которое было захвачено третьим оператором catch следующего кода.

Есть ли способ изменить этот код, чтобы сделать егопоток безопасно?Или это исключение возникает просто потому, что сервер не может обработать несколько одновременных HTTP-запросов (сервер занят), поэтому он отклоняет некоторые запросы и выводит код ошибки HTTP 502.Я думаю, что если сервер занят, обработка должна замедлиться и не должна выдавать исключение.

private String executeParser(String sku, String inputText, String msgId) {

        String jsonOutput = null;
        String urlStr = null;
        try {
            String encodedInputText = URLEncoder.encode("\"" + inputText + "\"", "UTF-8").replace("+", "%20");
            urlStr = parserServerSelection();
            URL url = new URL(urlStr + encodedInputText);
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
            jsonOutput = in.readLine();
            in.close();
            LOGGER.info("{} is parsed by {} {}", sku, urlStr, msgId);
        } catch (UnsupportedEncodingException e) {
            LOGGER.error("UnsupportedEncodingException failed! {} {} {} {}", sku, inputText, urlStr, msgId);
            e.printStackTrace();
        } catch (MalformedURLException e) {
            LOGGER.error("MalformedURLException failed! {} {} {} {}", sku, inputText, urlStr, msgId);
            e.printStackTrace();
        } catch (IOException e) {
            LOGGER.error("IOException failed! {} {} {} {}", sku, inputText, urlStr, msgId);
            e.printStackTrace();
        }
        return jsonOutput;
    }

РЕДАКТИРОВАТЬ:

private String parserServerSelection() {
        int numOfParsers = PARSER_WEBSERVICE_URL.size();
        if (numOfParsers == 1) {
            return PARSER_WEBSERVICE_URL.get(0);
        }
        Random random = new Random();
        return PARSER_WEBSERVICE_URL.get(random.nextInt(numOfParsers));
    }

1 Ответ

0 голосов
/ 24 сентября 2018

Если вызываемый метод использует только ссылки на параметры, а не общие данные, по определению он будет потокобезопасным.

Я не вижу ссылок на this, поэтому я предполагаю, что нет общих, изменяемых ссылок,Я не вижу, что делает ваш parserServerSelection метод.

HTTP 502 означает плохой шлюз .Это не означает, что вы не смогли сделать поток метода безопасным.

Ваша обработка исключений может быть намного проще.Блок catch повторяется четыре раза, за исключением повторяющегося имени исключения в сообщении.Я бы свернул их в один улов:

catch (Exception e) {
    String message = String.format("sku: %s inputText: %s URL: %s msgId: %s", sku, inputText, urlStr, msgId); 
    LOGGER.error(message, e);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...