Frage

Ich bin versucht, einen Strom von XML-Ereignissen über einen Java NIO-Kanal zu empfangen. Ich bin neu in beiden NIO und StAX Parsing, so konnte ich sehr leicht mit Blick auf etwas sein:)

Meine Suche hat mich mehrere SAX und StAX Implementierungen geführt, aber sie scheinen alle auf Inputstreams und InputSources zu betreiben - nicht NIO-Kanäle. Die beiden nächsten Versuche, die ich gemacht habe waren die Input aus dem Kanal zu erhalten und eine PipedInputStream erstellen:

// 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);

, gefolgt von:

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

Wenn der obige Code wird mit Verfahren 1, blockiert es auf der createXMLStreamReader Leitung verwendet. Wenn Methoden 2/3 verwendet werden, sie sofort IllegalBlockingModeException werfen (ich verstehe, warum). Vielleicht ist ein neuer Ansatz erforderlich?

Mein Ziel ist ein non-blocking-Server haben wählen => Zeichendaten von einem Client akzeptieren => es zu XML Ereignissen analysieren> eine spezielle Codierung = zu einem anderen Thread das Ereignis Objekt weiterleiten zur Verarbeitung => und Rückkehr in dem Auswahl.

So bin ich mit Blick auf etwas, oder gibt es einen besseren Ansatz, der verwendet werden kann? Wenn ja, was?

Danke!

War es hilfreich?

Lösung

Sind Sie sicher, dass Sie benötigen NIO zu benutzen? Es kann nicht die relativen Vorteile ursprünglich erwartet bieten:

Paul Tyma: Tötet den Mythos bitte. NIO ist nicht schneller als IO

Paul Tyma: Writing Java Multithreaded-Server - was alt ist neue

Ein Stapel zeigt, wo innerhalb createXMLStreamReader () es könnte helfen, blockiert, aber es ist wahrscheinlich so entworfen verhalten. Wenn es entworfen wurde gegen Inputstreams zum Arbeiten immer entweder (1) gibt die erwartete Menge an Daten; (2) Ende; oder (3) Block, dann wird es nicht automatisch verhalten sie (in der Regel komplizierter und Stateful) Art und Weise, nach der Lektüre jede Menge unvollständiger Eingabe, ohne viele tiefen Überarbeitung zurückkehren kann.

Andere Tipps

Ich begann auch umsah, auch für XMPP-Server verwenden. Ich habe mich um und es sieht aus wie es nur eine Implementierung ist die NIO Unterstützung verspricht: Aalto http: // wiki. fasterxml.com/AaltoHome

Aber es scheint 0.9.5 Version veröffentlichte bis zu haben, März 2009. Also, ich bin nicht sicher, wie gut gepflegt ist, aber dies könnte ein guter Ausgangspunkt sein. Sofern Sie ein größeres Projekt überzeugen kann (vielleicht Woodstox), einige ihrer internen Klassen für NIO Unterstützung zu überarbeiten.

Sie müssen die java.nio.channels.Channels Utility-Klasse verwenden.

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

Sie müssen möglicherweise den Socket-Kanal konfigurieren, dass sie zu blockieren.

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

Das heißt, dass Sie nicht in der Lage sein, nicht blockierende E / A zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top