这些并发请求是否会导致静态服务故障?

时间:2018-09-24 19:23:40

标签: java rest executorservice

我正在使用Future Callable来同时调用以下方法。我收到了以下代码的第三个catch语句捕获的“ java.io.IOException:服务器返回HTTP响应代码:URL的502”异常。

是否可以修改此代码以使其线程安全?或仅由于服务器无法处理多个并发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 :(得分:0)

如果调用的方法仅使用参数引用,而没有共享数据,则根据定义,该方法将是线程安全的。

我看不到对this的引用,因此我将假定没有共享的可变引用。我看不到您的parserServerSelection方法在做什么。

HTTP 502的意思是bad gateway。这并不意味着您未能使方法线程安全。

您的异常处理可以简单得多。除了消息中重复的异常名称外,catch块重复四次。我将它们折叠成一个小块:

catch (Exception e) {
    String message = String.format("sku: %s inputText: %s URL: %s msgId: %s", sku, inputText, urlStr, msgId); 
    LOGGER.error(message, e);
}