Разбор StAX с канала Java NIO - PullRequest
7 голосов
/ 25 июня 2009

Я пытаюсь получить поток событий XML по каналу Java NIO. Я новичок в разборе как NIO, так и StAX, так что я мог бы легко что-то пропустить:)

Мой поиск привел меня к нескольким реализациям SAX и StAX, но все они, похоже, работают на InputStreams и InputSources - не на каналах NIO. Две самые близкие попытки, которые я предпринял, состояли в том, чтобы получить InputStream из канала и создать PipedInputStream:

// method 1
PipedOutputStream out = new PipedOutputStream();
InputStream in = new PipedInputStream(out);
PrintWriter writer = new PrintWriter(out);

//method 2
InputStream in = channel.socket().getInputStream()
//method 3
IputStream in = Channels.newInputStream(channel);

с последующим:

XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance()
        .createXMLStreamReader(in);
//...

Когда вышеуказанный код используется с методом 1, он блокируется в строке createXMLStreamReader. Когда используются методы 2/3, они немедленно генерируют исключение IllegalBlockingModeException (я понимаю, почему). Может быть, нужен новый подход?

Моя цель - сделать так, чтобы неблокирующий сервер выбирал => принимал символьные данные от клиента => анализировал их на события XML, используя определенную кодировку =>, пересылал этот объект события в другой поток для обработки => и возвращался к выбор.

Так я что-то упускаю или есть лучший подход, который можно использовать? Если так, что?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 04 июля 2009

Вы уверены, что вам нужно использовать NIO? Он может не предлагать относительную выгоду, первоначально ожидаемую:

Пол Тима: Убей миф, пожалуйста. NIO не быстрее, чем IO

Пол Тима: Написание многопоточных серверов Java - что нового - новое

Стек, показывающий, где внутри createXMLStreamReader (), который он блокирует, может помочь, но он, вероятно, ведет себя так, как задумано. Если он был разработан для работы с InputStreams, которые всегда либо (1) дают ожидаемый объем данных; (2) конец; или (3) блок, тогда он не будет автоматически вести себя (обычно более сложным и с сохранением состояния) способом, который может вернуться после прочтения любого количества неполного ввода, без большого количества глубокой переработки.

2 голосов
/ 14 октября 2009

Я тоже начал осматриваться, в том числе и для использования сервера XMPP. Я искал вокруг, и похоже, что есть только одна реализация, которая обещает поддержку NIO: Aalto http://wiki.fasterxml.com/AaltoHome

Но, похоже, он вышел до версии 0.9.5, март 2009 года. Так что я не уверен, насколько хорошо он поддерживается, но это может быть хорошей отправной точкой. Если вы не можете убедить более крупный проект (возможно, Woodstox), переработать некоторые из их внутренних классов для поддержки NIO.

0 голосов
/ 25 июня 2009

Вам необходимо использовать служебный класс java.nio.channels.Channels.

ReadableByteChannel ch = //...
InputStream in = Channels.newInputStream(ch);

Возможно, вам потребуется настроить канал сокета для блокировки.

SelectableChannel ch = //...
ch.configureBlocking(true);

Это означает, что вы не сможете выполнять неблокирующие операции ввода / вывода.

...