認証とルーティングに使用されるストリーミング SOAP プロキシに取り組んでいます。プロキシは、SOAP ヘッダーから資格情報とルーティング情報を読み取って検証する必要があります。また、ターゲット サービスによって消費される追加のメタデータで SOAP ヘッダーを強化する必要があります。
最初に、StAX (XMLStreamReader および XMLStreamWriter) を使用して概念実証を簡単にまとめました。問題なく動作しているように見えたので、コンセプトは証明されましたが、パフォーマンスは私が期待していたものではありませんでした. プロトタイプのプロファイリング中に、アプリケーションが文字のエンコード/デコードにかなりの量の CPU 時間を費やしていることに気付きました (30-80%)。
解決策は簡単だと思いました:
- XMLStreamReader によって読み取られたデータを InputStream からバッファに格納します
- SOAPヘッダの終了タグの直前のオフセットを取得(getLocation())
- オフセットに達するまでバッファからデータを送信する
- 追加データを送信
- 残りのデータをバッファから送信
- InputStream からデータを送信する
これにより、不要なエンコード/デコードがすべて回避されます。しかし驚いたことに、標準実装では getLocation() がサポートされていないことがわかりました。-1 が返されます。
廃止されたセクション - XMLStreamReader は一度に 1 バイトを読み取るときに途方もない量のメモリを消費するため、以下は実際には機能しません。「一度に 1 バイトを返し、読み取ったバイト数を追跡する InputStreamReader を作成すると、InputStream からオフセットを取得できることに気付きました。ただし、これは適切な解決策とは思えません。不条理な数の読み取り呼び出しが発生する可能性が高くなります。追加のデコード/エンコードよりも大きなパフォーマンス ヒットを引き起こします。」
カスタムパーサーを書くことが問題外である場合、ここで私のオプションは何ですか? 実績があり、getLocation() をサポートする標準準拠の XMLStreamReader 実装はありますか?