Domanda

Sto tentando di ricevere un flusso di eventi XML su un canale Java NIO. Sono nuovo dell'analisi NIO e StAX, quindi potrei facilmente trascurare qualcosa :)

La mia ricerca mi ha portato a diverse implementazioni SAX e StAX, ma tutte sembrano funzionare su InputStreams e InputSources, non su canali NIO. I due tentativi più vicini che ho fatto sono stati di ottenere InputStream dal canale e creare 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);

seguito da:

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

Quando si utilizza il codice sopra con il metodo 1, si blocca sulla riga createXMLStreamReader. Quando vengono utilizzati i metodi 2/3, generano immediatamente IllegalBlockingModeException (capisco perché). Forse è necessario un nuovo approccio?

Il mio obiettivo è quello di avere un server non bloccante select = > accetta i dati dei caratteri da un client = > analizzarlo in eventi XML usando una codifica specifica = > inoltra l'oggetto evento a un altro thread per l'elaborazione = > e tornare alla selezione.

Quindi sto trascurando qualcosa o c'è un approccio migliore che può essere usato? Se sì, cosa?

Grazie!

È stato utile?

Soluzione

Sei sicuro di dover usare NIO? Potrebbe non offrire i vantaggi relativi inizialmente previsti:

Paul Tyma: Uccidi il mito per favore. NIO è non più veloce di IO

Paul Tyma: Scrittura di server multithreading Java - ciò che è vecchio nuovi

Uno stack che mostra dove all'interno di createXMLStreamReader () si sta bloccando potrebbe aiutare, ma probabilmente si sta comportando come progettato. Se è stato progettato per funzionare con InputStreams che sempre (1) forniscono la quantità di dati prevista; (2) fine; o (3) blocco, quindi non si comporterà automaticamente in un modo (di solito più complicato e con uno stato) che può tornare dopo aver letto qualsiasi quantità di input incompleto, senza un sacco di profonda rielaborazione.

Altri suggerimenti

Ho anche iniziato a guardarmi intorno, anche per l'uso del server XMPP. Mi sono guardato intorno e sembra che ci sia una sola implementazione che promette il supporto NIO: Aalto http: // wiki. fasterxml.com/AaltoHome

Ma sembra che sia stato rilasciato fino alla versione 0.9.5, marzo 2009. Quindi, non sono sicuro di quanto sia ben mantenuto, ma questo potrebbe essere un buon punto di partenza. A meno che tu non riesca a convincere un progetto più grande (forse Woodstox), a rielaborare alcune delle loro classi interne per il supporto NIO.

Devi usare la classe di utilità java.nio.channels.Channels.

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

Potrebbe essere necessario configurare il canale socket da bloccare.

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

Ciò significa che non sarà possibile eseguire operazioni di I / O non bloccanti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top