JRE に既にバンドルされている JAX-WS API を使用して、提供された WSDL ファイルから WebService クライアントを作成しました。JDK6 Update 37のwsimportツールを使用してプロキシ クラスを生成しました。
クライアントは、MTOM とストリーミングを使用して、大きなファイル/データをダウンロードできる必要があります。
Metro ユーザー ガイドに記載されている手順に従いました。
呼び出しているプロキシ メソッドはDateHandler
オブジェクトを返します。
package de.christopherhuebner.webservicetest.client;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URL;
import javax.activation.DataHandler;
import javax.xml.namespace.QName;
import de.christopherhuebner.webservicetest.ImageServer;
import de.christopherhuebner.webservicetest.ImageServerService;
public class ImageServiceClient {
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:8080/ImageWebService?wsdl");
QName qname = new QName("http://webservicetest.christopherhuebner.de/", "ImageServerService");
ImageServerService is = new ImageServerService(url, qname);
MTOMFeature mtom = new MTOMFeature();
StreamingAttachmentFeature stf = new StreamingAttachmentFeature(null, true, 4000000L);
ImageServer port = is.getImageServerPort(mtom, stf);
DataHandler dh = port.getImage();
System.out.println("Java-Version: " + System.getProperty("java.version"));
System.out.println("DataHandler: " + dh.getClass());
System.out.println("DataSource: " + dh.getDataSource().getClass());
OutputStream out = new FileOutputStream("test.jpg");
dh.writeTo(out);
out.close();
}
}
このコードを JRE6 で実行すると、次の出力がコンソールに出力されます。
Java-Version: 1.6.0_37
DataHandler: class javax.activation.DataHandler
DataSource: class com.sun.istack.internal.ByteArrayDataSource
残念ながらByteArrayDataSource
、クライアントのメモリがいっぱいになりOutOfMemoryException
、最大ヒープ サイズよりも大きなデータを受信すると が発生するため、ストリーミングはできません。すでに述べたユーザーガイドDataHandler
で提案されているように、あえてこれを aにキャストすると、 aがスローされます。StreamingDataHandler
ClassCastException
JRE7 でクライアントを実行する場合、ユーザー ガイドに記載されているように、すべて問題ありません。
Java-Version: 1.7.0_10
DataHandler: class com.sun.xml.internal.ws.encoding.MIMEPartStreamingDataHandler
DataSource: class com.sun.xml.internal.ws.encoding.MIMEPartStreamingDataHandler$StreamingDataSource
JRE6StreamingDataHandler
を使用している場合、元に戻す可能性はありますか? それとも、メカニズムを介して新しいJAX-WS RIバージョン (Metro、JRE に含まれているようです) を使用する必要がありますか?-Djava.endorsed.dirs=path_to_newer_jaxws_libs
ストリーミング中に生成される一時ファイル ( MIMExxxxx.tmp、設定については を参照StreamingAttachmentFeature
) はいつ削除されますか?