Вопрос

Я пытаюсь получить поток 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-события, используя определенную кодировку => перенаправлял этот объект события в другой поток для обработки => и возвращался к выбору.

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

Спасибо!

Это было полезно?

Решение

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

Пол Тайма: Уничтожьте миф, пожалуйста.НИО - это не быстрее, чем ввод-вывод

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top