2

我使用 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 。StreamingDataHandlerClassCastException

使用 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配置)?

4

0 回答 0