編程生活

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            113 隨筆 :: 0 文章 :: 18 評論 :: 0 Trackbacks

           

          最近在使用javax.xml.parsers.DocumentBuilder解析xml文件的時候偶爾會出錯:

           

          org.xml.sax.SAXException: FWK005 parse may not be called while parsing.
                  at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:
          263)
                  at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:
          284)
                  at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:
          208)

           

          跟蹤了一下代碼,發現這個異常是在com.sun.org.apache.xerces.internal.parsers.DTDConfiguration.parse(DTDConfiguration.java:546)拋出來的。該段代碼結構如下:

           

          if(fParseInProgress) {
              
          throw new XNIException("FWK005 parse may not be called while parsing.");
          }


          fParseInProgress 
          = true;

          // 解析xml文件

          finally {
              fParseInProgress 
          = false;
          }

           

          從程序邏輯來看,如果當前DocumentBuilder對象正在轉換文檔,此時再次請求轉換文檔,那么直接拋出XNIException(“FWK005 parse may not be called while parsing.”);異常。

          這個問題也比較好解決,一種是對轉換xml文檔的方法,增加synchronized關鍵字,這樣子不會有兩個線程同時訪問方法。

          還有一種方法是創建一個DocumentBuilder類型的ThreadLocal變量,這樣子每個線程都擁有自己的DocumentBuilder對象,能夠同時轉換多個xml文件。代碼如下:

           

          private static ThreadLocal docBuildeIns = new ThreadLocal() {
              
          protected DocumentBuilder initialValue() {
                  
          try {
                      
          return DocumentBuilderFactory.newInstance().newDocumentBuilder();
                  }
           catch (ParserConfigurationException e) {
                      String msg 
          = "DocumentBuilder 對象初始化失敗!";
                      log.error(msg, e);
                      
          throw new IllegalStateException(msg, e);
                  }

              }

          }
          ;

           

          posted on 2012-05-09 17:18 wilesun 閱讀(6538) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 黄石市| 汕尾市| 凯里市| 乌兰察布市| 尉犁县| 化州市| 波密县| 庆安县| 铅山县| 长阳| 滦平县| 郎溪县| 潮安县| 政和县| 克山县| 淮安市| 太湖县| 高碑店市| 勐海县| 宜丰县| 龙泉市| 故城县| 彝良县| 亳州市| 泸定县| 五大连池市| 沂源县| 彩票| 微山县| 诸暨市| 拉孜县| 承德市| 阳朔县| 西乡县| 岳西县| 邵武市| 大余县| 耒阳市| 新安县| 简阳市| 青河县|