1

私の問題は次のようなものです: JAX-WS SoapHandler with large messages: OutOfMemoryError and JAXWS Soap Handler Large MTOM Attachments

Metro-Runtime-Configuration である tomcat を使用していますが、ヘッダーを追加しようとするとHandlerChainOutOfMemory例外が発生します。

public boolean handleMessage(SOAPMessageContext smc) {
    if (Boolean.TRUE.equals(smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY))) {
        SOAPMessage sm = smc.getMessage(); // <- OutOfMemory
        ...

Ahmed は最初のリンクでそれを書いてI was able to write code that handles the raw data stream in 3 out of the 4 cases. Fortunately the three cases included the two we were mostly interested in: to/from the server.いますが、そのためのコード スニペットは提供していません。

私が試したこと:

これは、オーバーライドできなかっOutOfMemoryた JDK7 で発生します。AbstractMessageImpl#readAsSOAPMessageカスタム ブートストラップを使用してそのクラスをオーバーライドすることは可能ですか? そして、どうやってそうするのですか?Integerクラスを「オーバーライド」できましたが、AbstractMessageImpl取得されませんでした。

ランタイムを Apache CXF に変更しても、生成した JAX-WS RI クライアントで機能しませんでした ( Cannot create a secure XMLInputFactory)

別のプロバイダー/ランタイムを使用する別の可能性はありますか? そうでない場合、どうすればJDK7をオーバーライドできますAbstractMessageImpl#readAsSOAPMessageか?

または: MTOM とハンドラー チェーンの順序を構成することは可能ですか? MTOM されたメッセージは OutOfMemory をスローすべきではありません。そうですか?

前もってありがとう

4

1 に答える 1

2

この問題は、次のチケット レポートにも記載されています: https://java.net/jira/browse/WSIT-1081

ハンドラーを使用せずに、次のようなポートを作成するときにヘッダーを追加することで、この問題を解決しました。

Web サービスの作成

WebServiceEndpoint endpoint = w.getWebServiceEndpointPort(new MTOMFeature());
Map<String, Object> ctxt = ((BindingProvider) endpoint).getRequestContext();
// Enable HTTP chunking mode, otherwise HttpURLConnection buffers
ctxt.put("com.sun.xml.ws.transport.http.client.streaming.chunk.size", 8192);
WSBindingProvider bp = (WSBindingProvider) endpoint;
bp.setOutboundHeaders(Headers.create(JAXBContext.newInstance(WSSecurityHeader.class), 
                      new WSSecurityHeader()));

ヘッダー作成はメソッドで提供されないため、複雑なヘッダー タイプには JAXB が使用されます。

WSSecurityHeader.java

@XmlRootElement(name = "Security")
public class WSSecurityHeader {

    @XmlElement(name = "UsernameToken")
    public WSSecurityUsernameToken usernameToken = new WSSecurityUsernameToken();
    ...
}

短所

クライアントには、このコードが機能する多くのライブラリが必要です: JAXB、JAX-WS、StreamBuffer、Policy、Stax-Ex、gmbal-api-only など、ヘッダーを追加するだけでは恐ろしいものです。(特に Maven をサポートしていないファット クライアントを使用している場合)

于 2013-10-08T12:25:22.157 に答える