我使用 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
StreamingDataHandler
使用JRE6时是否有可能获得回报?还是我真的被迫通过机制使用更新的JAX-WS RI版本(Metro,似乎包含在 JRE 中)-Djava.endorsed.dirs=path_to_newer_jaxws_libs
?
何时删除在流式传输期间生成的临时文件(MIMExxxxx.tmp,请参阅StreamingAttachmentFeature
配置)?