Почему мой unmarshaller ждет, пока у него не появится следующий элемент start для возврата с использованием XMLStreamReader? - PullRequest
2 голосов
/ 29 февраля 2012

У меня есть скрипт Python и тест Java, работающие параллельно. Они оба пытаются сделать одно и то же - открыть сокет, получить бесконечный поток XML и анализировать XML по мере его поступления. Скрипт Python использует Expat, в то время как тест Java использует XMLStreamReader и Unmarshaller.

Скрипт Python всегда на один шаг / объект опережает тест Java, например когда у меня достаточно XML для демаршалирования объекта, скрипт Python немедленно делает это, в то время как Java-демаршаллер только НАЧИНАЕТ демаршаллинг и ЖДЕТ начала следующего тега XML для начала перед возвратом ранее немаршалированного объекта. Если я получу XML-объекты с интервалом в 20 секунд, непременно Java-демаршаллер НЕ вернется, пока не будет получено следующее.

  1. XML получил
  2. Python и Java начинают демаршаллинг
  3. Python возвращается немедленно
  4. Получен новый XML
  5. Java unmarshaller возвращает
  6. Вернуться к шагу 2

    XMLStreamReader reader = XMLInputFactory.newFactory (). CreateXMLStreamReader (socket.getInputStream ());

    while (reader.hasNext ()) { // Unmarshal here - зависает до следующего XML }

XMLStreamReader - это com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl

Эта проблема, кажется, также описывает это довольно хорошо: http://java.net/jira/browse/JAXB-419

Классы 2.1.10, упомянутые в этом выпуске, выглядят так:

1 Ответ

0 голосов
/ 30 марта 2012

Unmarshaller хочет поместить «курсор» на событие , следующее за событием конечного элемента той части, которую он unmarshalled.Поэтому он «зависает», пока что-то не станет доступным.Из документа API:

Этот метод предполагает, что анализатор находится в событии START_DOCUMENT или START_ELEMENT.Разборка будет выполняться от этого начального события до соответствующего конечного события.Если этот метод завершится успешно, читатель будет указывать на токен сразу после события завершения.

Однако подойдет любое событие XML: возможно, вы можете сделать какую-то хитрость, вставив комментарий XML впоток ...

...