1

SOAP Web サービスを構築しています。JAX-WS を使用してこのサービスを作成し、Glassfish 3.1.2 サーバーにデプロイしています。

このサービスが必要なものの XML 表現を含む String ビルドを返すことに問題はありません。特定のオブジェクトを返すようにすることもできます。私が問題を抱えているのは、このリソースのストリーミングです。

これは私がこれまでに持っているものです:

インターフェース:

@MTOM
@WebService
@XmlRootElement(name="root.element.class.location")
@SOAPBinding(style = Style.RPC, use=Use.LITERAL)
public interface ResultsServer {

    @WebMethod
    @XmlMimeType("text/xml")
    public Test getResultDataAsXML(@WebParam(name="Id") Integer id) throws Exception;
}

実装:

- - 編集 - -

これは、リソースをストリーミングしたい場所です。オブジェクトが非常に大きくなる必要があるとしましょうresults。これをメモリに保持したくないので、保持せずに送信を開始したいとします。(コードでこれをコメントしました)

@WebService(endpointInterface = "my.endpoint.class")
@StreamingAttachment(parseEagerly=true, memoryThreshold=4000000L)
public class ResultsServerImpl implements ResultsServer {

    @Override 
    public Test getResultDataAsXML(Integer id) throws Exception {
        Test results = new Test();
        for(int i=0; i<[very large number]; i++) {
            results.getResults().add("here : " + i);
            /**at one point, this is too large to hold in memory
            I would like to be able to start returning the object here
            so it is not taking up all available memory */
        }
        return results; //or close the stream
    }
}

---- 編集終了 ----

そして、私のTestクラスは次のような単純なクラスです:

public class Test {

    private ArrayList<String> results;

    public Test() {
        results = new ArrayList<String>();
    }

    public ArrayList<String> getResults() {
        return results;
    }

    public void setResults(ArrayList<String> results) {
        this.results = results;
    }
}

Testこのオブジェクトが非常に大きくなる (そしてより複雑になる) と仮定しましょう。このオブジェクトをストリーミングできる必要があります。これをストリーミングするにはどうすればよいですか。

理想的には、このオブジェクトの構造を維持したいと考えています。

これまで読んだことから、このオブジェクトを何らかの形で変換してDataHandler返す必要があります。

どんな助けでも大歓迎です!ありがとうございました。

4

2 に答える 2

0

JAX-WS 実装は、JAXB 実装を活用してオブジェクトをマーシャリングし (ほとんどの場合 StAX XMLStreamWriter に)、出力がストリーミングされるようにします (メモリ内に XML ドキュメントが作成されることはありません)。

@BlaiseDoughan私が探していた方法でこれを表現したと思います。はい、それは Test のインスタンスがメモリに完全に保存されるのを防ぐためです。これを行う方法はありますか?

データを (SOAP 添付ではなく) XML としてメッセージに表示する場合は、JAXB のマーシャリング イベントを利用できます。イベントでは、beforeMarshalデータをオブジェクトにロードしてからafterUnmarshalメソッドでクリアできます。最終的にすべてのデータが取り込まれますが、すべてが同時に参照されるわけではありません。

于 2013-05-27T20:47:29.073 に答える
-1

サービスの両側でバインド可能であり、SOAP エンベロープと互換性があるため、ストリーミングにはthinkworks の xstream ( http://x-stream.github.io/ ) ライブラリを使用することをお勧めします。実際、ActiveSOAP との統合さえあります。

SOAP エンベロープでラップされた xstream オブジェクトの例は、http://jira.codehaus.org/secure/attachment/19097/SoapEnvelopeTestCase.java で確認できますjboss からの完全な使用法は、 https: //issues.jboss.org/secure/attachment/12325534/SOAPClient.java?_sscc= t で確認できます。

XStream は、いくつかの非常に大規模なストリーミング プロセスに使用されています (問題なく 100 MB 以上の大きなテキスト オブジェクトに使用しました)。

于 2013-05-27T19:45:11.720 に答える