java多線程異常被喫!
在寫多任務需要需要使用多線程的時候,總會有這麼一種不可思議的現象,子線程有些非業務異常沒有捕獲拋出,結果主線程沒有捕獲到異常,查看日誌也沒有任何輸出.頭大的很!比如下面的例子:
主線程:
try {
inputStreamReader = new InputStreamReader(new FileInputStream(file), encoding);
bufferedReader = new BufferedReader(inputStreamReader);
String temp;
while ((temp = bufferedReader.readLine()) != null) {
finalString.append(temp);
}
logger.debug("File contents:" + finalString);
if (fileName.contains("url")) {
url = finalString.toString().trim();
} else {
ExecutorServiceUtil.getExecutorServiceInstance().submit(new MyRunnable(fileName, finalString));
}
bufferedReader.close();
} catch (FileNotFoundException e) {
logger.error("File not exists");
} catch (IOException e) {
logger.error("File reader failed");
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (Exception e) {
logger.error("close exception,[{}]", e);
}
}
}
Runnable:
class MyRunnable implements Runnable {
private Logger logger = LoggerFactory.getLogger(MyRunnable.class);
private StringBuilder queryParam;
private String fileName;
private MyRunnable(String fileName, StringBuilder queryParam) {
this.fileName = fileName;
this.queryParam = queryParam;
}
@Override
public void run() {
logger.info("==================================query start===================================");
while (true) {
if (url != null) {
WebServiceClient.fileToWebService(fileName, queryParam.toString(), url);
break;
} else {
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
logger.info("===================================query end===================================");
}
}
子任務執行的方法:
public static void fileToWebService(String fileName, String queryParam, String wsdl) {
log.info("Request Param:fileName:[{}],queryParam:[{}]", fileName, queryParam);
String realUrl = "";
URL url;
Queryservice queryservice;
if (wsdl != null) {
if (wsdl.contains(WSDL)) {
realUrl = wsdl.substring(0, wsdl.indexOf("?wsdl"));
} else {
realUrl = wsdl;
}
} else {
log.error("url is error! url:[{}]");
}
final DataHandler dataHandler = new DataHandler();
try {
dataHandler.setQueryXml(queryParam);
url = new URL(realUrl);
queryservice = new com.dxss.ws.Queryservice(url);
QueryServicePortType queryPort = queryservice.getQueryServiceFor718ImplPort();
callWebservice(queryParam
, fileName.contains(".") ? fileName.substring(0, fileName.indexOf(".")) : fileName
, queryPort
, dataHandler);
} catch (MalformedURLException e) {
log.error("client error!:[{}]", e);
dataHandler.setReturnValue(new Holder<>("client error!"));
dataHandler.setErrorFlag(new Holder<>(0));
// } catch (InaccessibleWSDLException e) {
// log.error("the product is not ready ![{}]", e);
// } catch (Exception e) {
// log.error("unknown error![{}]", e);
// }
}
}
測試一下最簡單的異常,遠程服務未啓動!結果如下:
日誌裏面並沒有重試,遠程服務未就緒的錯誤;
待續!