java多線程異常被喫!

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);
//        }
        }
    }

測試一下最簡單的異常,遠程服務未啓動!結果如下:

日誌裏面並沒有重試,遠程服務未就緒的錯誤;

待續!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章