Estoy intentando recibir una secuencia de eventos XML sobre un canal Java NIO. Soy nuevo en el análisis de NIO y StAX, así que fácilmente podría estar pasando por alto algo :)Análisis StAX del canal Java NIO
Mi búsqueda me ha llevado a varias implementaciones de SAX y StAX, pero todas parecen operar en InputStreams y InputSources, no en NIO canales Los dos intentos más cercanos que he hecho han sido para obtener el InputStream desde el canal y crear una 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);
seguido de:
XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance()
.createXMLStreamReader(in);
//...
Cuando el código anterior se utiliza con el método 1, bloquea en la línea createXMLStreamReader. Cuando se usan los métodos 2/3, inmediatamente lanzan IllegalBlockingModeException (entiendo por qué). Tal vez se necesita un nuevo enfoque?
Mi objetivo es tener un servidor sin bloqueo select => aceptar datos de caracteres de un cliente => analizarlos con eventos XML utilizando una codificación específica => reenviar ese objeto de evento a otro hilo para procesar => y volver a la selección.
Así que estoy pasando por alto algo, o hay un mejor enfoque que se puede utilizar? ¿Entonces qué?
Gracias!
Como mencionó Fern, el procesador Aalto xml tiene el modo asíncrono, que está diseñado para tales casos de uso. No ha habido mucho interés (no muchos sistemas basados en NIO ... todavía) para el modo asíncrono - todos los usuarios existentes parecen usar BIO - pero en realidad sería una muy buena opción. – StaxMan
Y finalmente con la versión 0.9.7, hay un poco de documentación para mostrar cómo analizar sin bloquear, ver: http://www.cowtowncoder.com/blog/archives/2011/03/entry_451.html – StaxMan