首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

生產者-消費者模式實現高效 XML 解析:SAX 與 SmartQueue 實戰

     編輯:Java 相關知識

背景與挑戰

在 B2B 企業級應用中,XML 扮演關鍵資料交換格式。傳統單執行緒解析雖簡單,但在多執行緒應用伺服器環境下,需為並發請求建立專屬解析執行緒,並將解析資料高效分發給多個工作執行緒。本文提出基於生產者-消費者模式的並發 XML 解析架構。

架構設計:SmartQueue 緩衝隊列

核心思想:單一生產者執行緒負責解析 XML,多個消費者執行緒處理解析後的資料。為平衡生產與消費速度、避免記憶體溢位,引入固定長度的 SmartQueue:

  • 隊列滿時掛起生產者
  • 隊列空時掛起消費者
  • 文件結束時通知所有消費者停止等待

SmartQueue 關鍵實現

public synchronized void put(Object data) {
    while (list.size() >= 2) { // 固定長度 2
        try { wait(); } catch (Exception ex) {}
    }
    list.add(data);
    notifyAll();
}

public synchronized Object take() {
    while (list.size() <= 0 && !eof) {
        try { wait(); } catch (Exception ex) {}
    }
    Object obj = null;
    if (list.size() > 0) {
        obj = list.remove(0);
    }
    notifyAll();
    return obj;
}

SAX 解析控制器

選用 SAX API 因其流式讀取、低記憶體佔用、適合生產-消費模式。XMLParserHandler 繼承 DefaultHandler,實現回呼方法:

  • startElement:遇到目標元素(如 elemmark)建立新 Hashtable 承載單筆記錄
  • characters:累積元素文字內容
  • endElement:元素結束時將資料放入 SmartQueue,隊列滿則阻塞
  • endDocument:設定 EOF 標記,喚醒所有消費者

關鍵程式碼片段

public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
    if (qName.equalsIgnoreCase(elemmark)) {
        doc = new Hashtable();
    }
    elem = qName;
}

public void endElement(String namespaceURI, String localName, String qName) {
    String s = sbData.toString();
    if (qName.equalsIgnoreCase(elemmark)) {
        smartQueue.put(doc); // 阻塞直到有空位
        doc = null;
    }
}

public void endDocument() {
    smartQueue.end(); // 標記結束,喚醒消費者
}

消費者執行緒

消費者持續從隊列取出 Hashtable 處理,直到隊列為空且 EOF 為真:

public void run() {
    while (!queue.isEmpty() || !queue.onEnd()) {
        Hashtable val = (Hashtable) queue.take();
        // 處理業務邏輯...
    }
}

優勢與擴展性

  • 並發解析與消費: 大型 XML 檔案僅需少量記憶體即可流式處理
  • 策略可換: 修改 SmartQueue 的 put/take 邏輯可實現不同緩衝策略
  • 輸出可定製: XMLParserHandler 可擴充產生應用專屬物件,而非通用 Hashtable

範例程式執行

java -classpath . prodcons.TestProducerConsumerForXML order.xml

原始碼包含完整示範,展示執行緒協作與資料流向。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved