Próbuję odbierać strumień zdarzeń XML przez kanał Java NIO. Jestem nowy zarówno dla NIO, jak i StAXa, więc mogłem z łatwością coś przeoczyć :)Przetwarzanie StAX z kanału Java NIO
Moje poszukiwania doprowadziły mnie do kilku implementacji SAX i StAX, ale wszystkie działają na InputStreams i InputSources - nie NIO kanały. Dwa najbliższe próby Mam wykonane zostały uzyskać InputStream z kanału i stworzyć 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);
następuje:
XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance()
.createXMLStreamReader(in);
//...
Kiedy powyższy kod jest używany z metody 1, bloków w linii createXMLStreamReader. Kiedy metody 2/3 są używane, natychmiast rzucają IllegalBlockingModeException (rozumiem dlaczego). Może potrzebne jest nowe podejście?
Moim celem jest posiadanie niezablokowanego serwera select => akceptuj dane znakowe od klienta => parsuj go do zdarzeń XML za pomocą określonego kodowania => przekazuj ten obiekt zdarzenia do innego wątku w celu przetworzenia => i wróć do wybór.
Więc coś przeoczyłem, czy istnieje lepsze podejście, które można wykorzystać? Jeśli tak to co?
Dzięki!
Tak jak wspomniany Fern, procesor Aalto xml ma tryb asynchroniczny, który jest przeznaczony do takich przypadków użycia. Nie było zbyt dużego zainteresowania (nie wiele systemów opartych na NIO ... jeszcze) na tryb asynchroniczny - wszyscy dotychczasowi użytkownicy wydają się używać BIO - ale w rzeczywistości byłoby to bardzo dobre dopasowanie. – StaxMan
I wreszcie z wersją 0.9.7, jest trochę dokumentacji, aby pokazać, jak nie blokować analizy, zobacz: http://www.cowtowncoder.com/blog/archives/2011/03/entry_451.html – StaxMan