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
返す必要があります。
どんな助けでも大歓迎です!ありがとうございました。