8

Java NIO チャネルを介して XML イベントのストリームを受信しようとしています。私はNIOとStAXの両方の解析に慣れていないので、何かを見落としがちです:)

検索の結果、いくつかの SAX および StAX の実装にたどり着きましたが、それらはすべて、NIO チャネルではなく、InputStreams および InputSources で動作するようです。私が行った 2 つの最も近い試みは、チャネルから InputStream を取得し、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);

に続く:

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

上記のコードを方法 1 で使用すると、createXMLStreamReader 行でブロックされます。メソッド 2/3 が使用されると、すぐに IllegalBlockingModeException がスローされます (理由は理解しています)。新しいアプローチが必要かも?

私の目標は、非ブロッキングサーバーを選択する=>クライアントから文字データを受け入れる=>特定のエンコーディングを使用してXMLイベントに解析する=>そのイベントオブジェクトを別のスレッドに転送して処理する=>選択に戻ることです。

だから私は何かを見落としていますか、それとも使用できるより良いアプローチがありますか? もしそうなら何?

ありがとう!

4

3 に答える 3

4

本当にNIOを使う必要がありますか? 当初期待されていた相対的なメリットが得られない場合があります。

ポール・ティマ:神話を殺してください。NIO はIO よりも高速ではありません

Paul Tyma: Java マルチスレッド サーバーの作成 - 古いものは新しいもの

ブロックしている createXMLStreamReader() 内の場所を示すスタックが役立つ可能性がありますが、おそらく設計どおりに動作しています。常に次のいずれかの InputStreams に対して機能するように設計されている場合は、(1) 期待される量のデータが得られます。(2) 終わり; または(3)ブロックすると、多くの深いやり直しなしで、不完全な入力をいくらでも読み取った後に戻ることができる(通常はより複雑でステートフルな)方法で自動的に動作しません。

于 2009-07-03T20:49:19.537 に答える
2

また、XMPPサーバーの使用についても調べ始めました。私は周りを見回しており、NIOサポートを約束する実装は1つしかないようです: Aalto http://wiki.fasterxml.com/AaltoHome

しかし、2009 年 3 月にバージョン 0.9.5 までリリースされたようです。そのため、どの程度維持されているかはわかりませんが、これは良い出発点になるかもしれません。より大きなプロジェクト (おそらく Woodstox) を説得できない限り、NIO サポートのために内部クラスの一部を作り直す必要があります。

于 2009-10-13T23:28:31.693 に答える
0

java.nio.channels.Channelsユーティリティクラスを使用する必要があります。

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

ソケットチャネルをブロックするように構成する必要がある場合があります。

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

これは、ノンブロッキングI/Oを実行できないことを意味します。

于 2009-06-25T18:54:50.830 に答える