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

JRE6StreamingDataHandlerを使用している場合、元に戻す可能性はありますか? それとも、メカニズムを介して新しいJAX-WS RIバージョン (Metro、JRE に含まれているようです) を使用する必要がありますか?-Djava.endorsed.dirs=path_to_newer_jaxws_libs

ストリーミング中に生成される一時ファイル ( MIMExxxxx.tmp、設定については を参照StreamingAttachmentFeature) はいつ削除されますか?

4

0 に答える 0