2010-04-19 12 views
6

के लिए पूरी तरह से काम करेगा, मैंने स्कीमा के खिलाफ एक्सएमएल सत्यापन के लिए जेडोम का उपयोग किया है। मुख्य समस्या यह है कि यह एक त्रुटि है, जबकिजो एक्सएमएल वैलिडेटर मल्टीथ्रेडिंग प्रोजेक्ट

पार्स करने का मुख्य कारण एक ही समय में xerces सत्यापन के लिए काम कर रहे धागे की जिसमें एक से अधिक था

FWK005 पार्स नहीं कहा जा सकता है देता है। इसलिए मुझे समाधान मिला कि मुझे उस सत्यापन को लॉक करना है। जो अच्छा नहीं है

तो मुझे पता है कि जो सत्यापनकर्ता पूरी तरह से परियोजना

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

धन्यवाद सुनील कुमार साहू multithreading के लिए काम करता

उत्तर

4

मैं जावा एक्सएमएल सत्यापनकर्ता के किसी भी नहीं लगता कि threadsafe हैं चाहते हैं ।

  1. एक नया उदाहरण हर बार जब आप को मान्य करने के
  2. प्रमाणकों कि आप कैश करने के लिए ThreadLocal की
  3. उपयोग करें से खींच का एक पूल बनाने की जरूरत है सत्यापनकर्ताओं
+3

+1 - लेकिन पहला विकल्प आपको हर बार एक नया सत्यापनकर्ता बनाने के लिए होना चाहिए। (मौजूदा विकल्प प्रदर्शन अनुकूलन हैं, और केवल तभी विचार किया जाना चाहिए यदि आप * निश्चित रूप से जानते हैं * कि सत्यापनकर्ता उदाहरणों का निर्माण एक प्रदर्शन बाधा होगी।) –

+0

स्टीफन सी से ऊपर बहुत अच्छा बिंदु। – Dave

0

बनाएं इस के बाद से: विकल्प के लिए कर रहे सवाल बहु थ्रेडेड एक्सएमएल सत्यापन के बारे में है ... जावा में इस बग का ध्यान रखें 1.6: javax.xml.validation.Schema is not thread safe

स्कीमा क्लास जावाडोक का दावा है कि यह थ्रेड-सुरक्षित है, लेकिन यह टी नहीं था वह जावा के कुछ संस्करणों में मामला है। जब आप दो मान्यताओं को एक साथ चलाने का प्रयास करते हैं तो परिणाम अप्रत्याशित सत्यापन त्रुटियां होती है।

बग रिपोर्ट पर सुझाए गए कार्यवाही xerces लाइब्रेरी के एक नए संस्करण का उपयोग करना है।

संबंधित मुद्दे