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);
// }
}
}
测试一下最简单的异常,远程服务未启动!结果如下:
日志里面并没有重试,远程服务未就绪的错误;
待续!