2010-04-19 20 views
6

我已經使用jdom進行了針對模式的xml驗證。主要問題有,它提供了一個錯誤在解析哪個xml驗證器可以很好地用於多線程項目

的主要原因是在同一時間對於Xerces,驗證工作線程的多個

FWK005解析可能不會被調用。所以我得到了我必須鎖定驗證的解決方案。這是不好的

所以我想知道哪些XML驗證完全適用於多線程項目

public static HashMap<String, String> validate(String xmlString, Validator validator) { 

    HashMap<String, String> map = new HashMap<String, String>(); 
    long t1 = System.currentTimeMillis(); 
    DocumentBuilder builder = null; 
    try { 
     //obtain lock to proceed 
//   lock.lock(); 

     try { 
      builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
//    Source source = new DOMSource(builder.parse(new ByteArrayInputStream(xmlString.getBytes()))); 

      validator.validate(new StreamSource(new StringReader(xmlString))); 
      map.put("ISVALID", "TRUE"); 
      logger.info("We have successfuly validated the schema"); 
     } catch (Exception ioe) { 
      ioe.printStackTrace(); 
      logger.error("NOT2 VALID STRING IS :" + xmlString); 
      map.put("MSG", ioe.getMessage()); 
      //   logger.error("IOException while validating the input XML", ioe); 
     } 
     logger.info(map); 
     long t2 = System.currentTimeMillis(); 
     logger.info("XML VALIDATION TOOK:::" + (t2 - t1)); 

    } catch (Exception e) { 
     logger.error(e); 
    } finally { 
     //release lock 
//   lock.unlock(); 
     builder = null; 
    } 

    return map; 
} 

感謝 蘇尼爾·庫馬爾Sahoo

回答

4

我不認爲任何的Java XML驗證器是線程安全的。選項是:

  1. 創建一個新實例,你需要驗證
  2. 創建你
  3. 製作使用ThreadLocal中的緩存拉驗證池時間驗證器
+3

+1 - 但第一個選項應該只是簡單地創建一個新的驗證器,每次你需要一個。 (現有的選項是性能優化,只有在您確實知道驗證器實例的創建將會成爲性能瓶頸時才應考慮。) – 2010-05-02 04:06:47

+0

Stephen C.以上非常好的一點 – Dave 2010-05-02 14:07:50

0

由於這問題是關於多線程XML驗證...注意在Java 1.6中的這個錯誤:javax.xml.validation.Schema is not thread safe

架構類javadoc聲稱它是線程安全的,但這不是t他在一些java版本中使用。當您嘗試同時運行兩個驗證時,結果是意外的驗證錯誤。

錯誤報告中提出的解決方法是使用更新版本的xerces庫。

相關問題