Mtom を使用してファイルを転送しようとしましたが、SoapHandler を使用してクライアントの署名を検証するまで、かなりうまく機能しています。SoapHandler はすべてのメッセージを保持し、base64 エンコードに変更します。そのため、巨大なファイルを取得しようとすると、Jvm がヒープ サイズの例外をスローします。この問題を解決する方法を知っていますか?
1 に答える
Java JRE には JAX-WS プロバイダーが付属しています。このプロバイダーには、私がバグと見なすものがあります。HandlerChain を直接取得するか、HandlerResolver を使用して SoapHandler を追加すると、MTOM を使用して正しく作成されたメッセージが分解され、添付ファイルが SOAP メッセージ内にインラインで配置されます。添付ファイルが大きい場合、パフォーマンスが非常に低下したり、メモリ不足のエラーが発生したりする可能性があります。
私が見つけた唯一の解決策は、別の JAX-WS プロバイダーを使用することです。テストの結果、Axis2 は完全に動作しているように見えます (ただし、膨大な数の依存関係があります)。クラスパスに別のプロバイダーを配置するだけで、それが使用されます。Java は、META-INF/services で javax.xml.ws.spi.Provider という名前のファイルを探します。このファイルが見つかった場合、指定されたプロバイダーが使用されます。Axis2 プロバイダーが確実に使用されるように、メインの Axis2 jar にはこのファイルが含まれます。他のプロバイダーでもこの問題が解決される場合があります。
この自動プロバイダー検出により、アプリケーションが実行されている場所に応じて、アプリケーションにこの問題がある場合とない場合があります。たとえば、アプリケーションを IBM WebSphere にデプロイする場合、デフォルトのプロバイダーはすでにオーバーライドされているため、この問題は発生しません。他のアプリケーション サーバーもデフォルトのプロバイダーをオーバーライドしている可能性があります。コピーを手に入れることができれば、IBM は、Axis2 がパッケージ化された非常に優れた jar com.ibm.jaxws.thinclient_7.0.0.jar も提供しています。これは、スタンドアロン アプリケーション (WebSphere で実行されていないアプリケーション) にのみ使用できますが、非常に便利で、この問題を解決します。