2009-06-25 19 views
7

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!

+0

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

+0

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

Respuesta

4

¿Estás seguro de que necesitas utilizar NIO? No podrá ofrecer los beneficios relativos esperados originalmente:

Paul TYMA: Kill the myth please. NIO is not faster than IO

Paul Tyma: Writing Java Multithreaded Servers - whats old is new

Una pila que muestra dónde el interior createXMLStreamReader() que está bloqueando podría ayudar, pero probablemente se está comportando como se ha diseñado . Si fue diseñado para trabajar en contra de InputStreams que siempre (1) dan la cantidad esperada de datos; (2) final; o (3) bloquear, entonces no se comportará automáticamente de una manera (usualmente más complicada y con mayor estado) que puede regresar después de leer cualquier cantidad de entrada incompleta, sin muchas reelaboraciones profundas.

+1

+1 - bastante revelador. –

+0

No se concede que NIO sea más rápido que la E/S predeterminada. Pero * puede * ser. – Renascienza

0

Debe utilizar la clase de utilidad java.nio.channels.Channels.

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

Es posible que necesite configurar el canal de socket que va a bloquear.

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

Esto significa que no podrá realizar E/S sin bloqueo.

+0

El OP ya lo intentó (ver método 3) . – skaffman

+0

Sí, noté que después de publicar, agregué la llamada a configureBlocking que debería arreglar el método 3. –

+0

El problema con el bloqueo es que estoy tratando de no tener un hilo por conexión, sino más bien un único hilo leído y luego descartado procesamiento adicional según sea necesario –

2

También comencé a buscar, también para el uso del servidor XMPP. He estado buscando y parece que solo hay una implementación que promete el soporte de NIO: Aalto http://wiki.fasterxml.com/AaltoHome

Pero parece haberse lanzado a la versión 0.9.5, marzo de 2009. Así que, no estoy seguro de qué tan bien mantenido es, pero este podría ser un buen punto de partida. A menos que puedas convencer a un proyecto más grande (tal vez Woodstox), para que rehaga algunas de sus clases internas para soporte de NIO.

+0

Comentario rápido: aunque puede no ser aparente desde la página de Aalto, su base de desarrolladores tiene una superposición significativa con Woodstox. Parte de esto es que los internos de Aalto son muy diferentes, y no es trivialmente fácil hacer que los sistemas basados ​​en BIO funcionen en NIO. Aalto, por otro lado, es una muy buena combinación para NIO - tiene modo asíncrono, que aunque bit incompleto (API no completamente definida), está bastante cerca de la producción lista. Entonces, si alguien está interesado, siéntete libre de unirte al foro de discusión de Aalto: a los desarrolladores (incluyéndome a mí) les encantaría ver más participación. – StaxMan

Cuestiones relacionadas