我正在使用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));
}
答案 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);
}