Question

J'essaie de recevoir un flux d'événements XML sur un canal Java NIO. Je suis novice en analyse syntaxique NIO et StAX, donc je pourrais très facilement oublier quelque chose:)

Ma recherche m'a conduit à plusieurs implémentations SAX et StAX, mais elles semblent toutes fonctionner sur InputStreams et InputSources - et non sur des canaux NIO. Les deux tentatives les plus proches que j’ai faites consistent à extraire le flux InputStream du canal et à créer un flux 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);

suivi de:

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

Lorsque le code ci-dessus est utilisé avec la méthode 1, il se bloque sur la ligne createXMLStreamReader. Lorsque les méthodes 2/3 sont utilisées, elles jettent immédiatement IllegalBlockingModeException (je comprends pourquoi). Peut-être une nouvelle approche est-elle nécessaire?

Mon objectif est d'avoir un serveur non bloquant select = > accepter les données de caractère d'un client = > analyser les événements XML en utilisant un codage spécifique = > transmettre cet événement à un autre thread pour le traitement = > et revenez à la sélection.

Est-ce que je néglige quelque chose ou existe-t-il une meilleure approche pouvant être utilisée? Si oui quoi?

Merci!

Était-ce utile?

La solution

Êtes-vous sûr de devoir utiliser NIO? Il se peut qu’il n’offre pas les avantages relatifs initialement prévus:

Paul Tyma: Tuez le mythe s'il vous plaît. NIO n'est pas plus rapide que l'IO

Paul Tyma: Écriture de serveurs multithread Java - la version la plus ancienne est nouveau

Une pile indiquant l'emplacement bloqué dans createXMLStreamReader () pourrait aider, mais elle se comportera probablement comme prévu. S'il a été conçu pour fonctionner avec InputStreams, qui soit toujours (1) donne la quantité de données attendue; (2) fin; ou (3) bloquer, alors il ne se comportera pas automatiquement (de manière généralement plus compliquée et plus dynamique) de manière à pouvoir revenir après la lecture de toute entrée incomplète, sans beaucoup de retouches en profondeur.

Autres conseils

J'ai aussi commencé à regarder autour de moi, également pour l'utilisation du serveur XMPP. J'ai regardé autour de moi et il semble qu'il n'y ait qu'une seule implémentation promettant le support de NIO: Aalto http: // wiki. Fastxml.com/AaltoHome

Mais il semble avoir été publié jusqu'à la version 0.9.5, mars 2009. Donc, je ne suis pas sûr de la qualité de sa maintenance, mais cela pourrait être un bon point de départ. À moins que vous ne puissiez convaincre un projet plus important (peut-être Woodstox), de retravailler certaines de leurs classes internes pour le support NIO.

Vous devez utiliser la classe de l'utilitaire java.nio.channels.Channels.

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

Vous devrez peut-être configurer le canal de socket pour le bloquer.

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

Cela signifie que vous ne pourrez pas effectuer d’E / S non bloquantes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top