ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS を使用した Web サービスの高度な機能のプログラミング
11g リリース 1 (10.3.1)
B55543-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

5 MTOM/XOP を使用したバイナリ データ転送の最適化

以下の節では、MTOM/XOP を使用してバイナリ データを送信する方法について説明します。

MTOM/XOP を使用したバイナリ データの送信

SOAP MTOM/XOP (Message Transmission Optimization Mechanism/XML-binary Optimized Packaging) では、SOAP メッセージ内の xs:base64Binary 型または xs:hexBinary 型の XML データの転送を最適化する方法が定義されています。転送プロトコルが HTTP の場合、MIME 添付ファイルを使用して、送信側と受信側の両方に対して同時に SOAP メッセージ内の XML データへの直接アクセスを許可する間にデータを伝達します。このとき、base64Binary または hexBinary データのマーシャリングに MIME アーティファクトが使用されていたことを意識する必要はありません。バイナリ データの最適化プロセスでは、1) バイナリ データのエンコード、2) SOAP エンベロープからのバイナリ データの削除、3) バイナリ データの圧縮、4) MIME パッケージへのバイナリ データの添付、および 5) SOAP エンベロープ内の MIME パッケージへの参照の追加を行います。

MTOM/XOP のサポートは、JWS アノテーションの使用によって、JAX-WS では標準となっています。MTOM 仕様では、MTOM が有効化されている場合に、base64binary または hexBinary データの送信時に Web サービスのランタイムで XOP バイナリ最適化を使用することは必須ではありません。むしろ、この仕様では、ランタイムがこれを選択して行うようになっています。これは場合によっては、直接 SOAP メッセージ内にバイナリ データを送信するほうが、より効率的であるとランタイムで判断されることがあるためです。一例としては、転送されるデータ量が少なく、単にデータをそのままインライン処理するよりも多くのリソースが、会話および転送のオーバーヘッドにより消費されてしまう場合が挙げられます。

デフォルトで base64Binary XML データ型にマップされる Java 型は、javax.activation.DataHandlerjava.awt.Imagejavax.xml.transform.Source です。base64Binary または hexBinary 型の要素は、デフォルトで byte[] にマップされます。

次の表に、MTOM/XOP を使用して base64Binary または hexBinary 型の添付ファイルを送信する手順をまとめます。

表 5-1 MTOM/XOP を使用してバイナリ データを送信する手順

#
手順 説明

1

MTOM 添付ファイルとして使用する予定のデータ型のアノテーションを追加する。(省略可能)

使用するプログラミング モデルに応じ、Java クラスまたは WSDL にアノテーションを追加して、バイナリ データの送信に使用するコンテンツ タイプを定義できます。この手順は省略可能です。XML バイナリ型は、デフォルトでは Java byte[] にマップされます。詳細については、「データ型のアノテーションの追加」を参照してください。

2

Web サービスで MTOM の有効

Web サービスで MTOM の有効化」を参照してください。

3

Web サービスのクライアントで MTOM の有効

クライアントで MTOM の有効化」を参照してください。

4

添付ファイルのしきい値の設定

xs:binary64 データをインラインまたは添付ファイルとして送信する場合に指定する添付ファイルのしきい値を設定します。「添付ファイルのしきい値の設定」を参照してください。


データ型のアノテーションの追加

使用するプログラミング モデルに応じ、Java クラスまたは WSDL にアノテーションを追加して、バイナリ データの送信に使用する MIME コンテンツ タイプを定義できます。この手順は省略可能です。

次の表に、MIME コンテンツ タイプと Java 型のマッピングを定義します。型によっては、デフォルトのマッピングが存在します。デフォルトのマッピングが存在しない MIME コンテンツ タイプは、DataHandler にマップされます。

表 5-2 MIME コンテンツ タイプと Java 型のマッピング

MIME コンテンツ タイプ Java 型
image/gif
java.awt.Image
image/jpeg
java.awt.Image
text/plain
java.lang.String
text/xml または application/xml
javax.xml.transform.Source
*/*

javax.activation.DataHandler

以下の節では、データ型のアノテーションを追加する方法について説明します。Java から始める方法と、WSDL から始める方法があります。

データ型のアノテーションを追加する : Java から始める場合

バイナリ データの送信に使用するコンテンツ タイプの定義を Java から始める場合は、バイナリ データを保持するフィールドに @XmlMimeType アノテーションを追加します。

バイナリ データを保持するフィールドは、DataHandler 型にする必要があります。

次のサンプルに、バイナリ データを保持する Java クラス内のフィールドにアノテーションを追加する方法を示します。

@WebMethod
@Oneway
public void dataUpload(
    @XmlMimeType("application/octet-stream") DataHandler data) 
{
}

データ型のアノテーションを追加する : WSDL から始める場合

バイナリ データの送信に使用するコンテンツ タイプの定義を WSDL から始める場合は、以下のいずれかの属性を使用して、xs:base64Binary または xs:hexBinary 型の WSDL 要素にアノテーションを追加します。

  • xmime:contentType - この要素のコンテンツ タイプを定義します。

  • xmime:expectedContentType - バイナリ データとして容認するメディア タイプの範囲を定義します。

次のサンプルでは、base64binary 型の image 要素を、java.awt.Image Java 型にマップされる image/gif MIME タイプにマップしています。

<element name="image" type="base64Binary"
xmime:expectedContentTypes="image/gif"
xmlns:xmime="http://www.w3.org/2005/05/xmlmime"/>

Web サービスで MTOM の有効化

次の節で説明しているように、アノテーションまたは WS-Policy ファイルを使用して Web サービスで MTOM を有効にすることができます。

アノテーションを使用して Web サービスで MTOM の有効化

Web サービスで MTOM を有効にするには、次のサンプルのようにサービス エンドポイント実装クラスに @java.xml.ws.soap.MTOMアノテーションを追加します。関連するコードは太字で示されています。

package examples.webservices.mtom;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.soap.MTOM; 

@MTOM
@WebService(name="MtomPortType",
            serviceName="MtomService",
            targetNamespace="http://example.org")
public class MTOMImpl { 
  @WebMethod
  public String echoBinaryAsString(byte[] bytes) {
    return new String(bytes);

  }
}

WS-Policy ファイルを使用して Web サービスで MTOM の有効化

前の節で説明したように、@MTOM アノテーションに加えて、WebLogic JAX-WS Web サービスでの MTOM/XOP のサポートはあらかじめパッケージ化された WS-Policy ファイル Mtom.xml を使用して実装されます。WS-Policy ファイルは、(http://www.w3.org/TR/ws-policy) で説明されている WS-Policy 仕様に準拠しています。この仕様では、Web サービスのポリシー (この場合は、バイナリ データ送信のための MTOM/XOP の使用) を記述および通信する汎用モデルおよび XML 構文を提供しています。Web サービス WSDL の types セクションへの、あらかじめパッケージ化された Mtom.xml WS-Policy ファイルのインストールは、次のようになります (参考のためにのみ掲載しています。このファイルを変更することはできません)。

<wsp:Policy wsu:Id="myService_policy">
     <wsp:ExactlyOne>
         <wsp:All>
             <wsoma:OptimizedMimeSerialization 
                    xmlns:wsoma="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization" /> 
         </wsp:All>
     </wsp:ExactlyOne>
 </wsp:Policy>

コンパイルされた JWS ファイルを WebLogic Server にデプロイする際には、MTOM WS-Policy ファイルを参照する次の抜粋コードが、動的 WSDL 内に自動的に含まれます。この抜粋コードでは、Web サービスが MTOM/XOP を使用することを示しています。

<wsdl:binding name="BasicHttpBinding_IMtomTest" 
                       type="i0:IMtomTest">
     <wsp:PolicyReference URI="#myService_policy" /> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />

JWS ファイルで @Policy メタデータ アノテーションを指定することによって、開発時に Web サービスと Mtom.xml WS-Policy ファイルを関連付けることができます。動的 WSDL に、必須である Mtom.xml ファイルへの参照が確実に含まれるよう、必ず attachToWsdl=true 属性も指定します。下記の例を参照してください。

デプロイメント時に Web サービスと Mtom.xml WS-Policy ファイルを関連付けるには、デプロイメント直前に types セクションにポリシーを追加し、WSDL を修正します。

また、Administration Console を使用して実行時にファイルを添付できます。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server Administration Console ヘルプ』の「WS-Policy ファイルと Web サービスとの関連付け」を参照してください。この節では、JWS アノテーションの使用方法について説明します。

次の簡単な JWS ファイルの例は、あらかじめパッケージ化された Mtom.xml ファイルを Web サービスに適用するために、JWS ファイルで @weblogic.jws.Policy アノテーションの使用方法を示します。(該当するコードは太字で示してあります)。

package examples.webservices.mtom;
import javax.jws.WebMethod;
import javax.jws.WebService;
 import weblogic.jws.Policy;
@WebService(name="MtomPortType",
             serviceName="MtomService",
             targetNamespace="http://example.org")
@Policy(uri="policy:Mtom.xml", attachToWsdl=true)
public class MtomImpl {
  @WebMethod
   public String echoBinaryAsString(byte[] bytes) {
     return new String(bytes);
   }
 

クライアントで MTOM の有効化

Web サービスのクライアントで MTOM を有効にするには、次のサンプルのように、Web サービスのプロキシまたはディスパッチの作成時にパラメータとして javax.xml.ws.soap.MTOMFeature を渡します。関連するコードは太字で示されています。

package examples.webservices.mtom.client;

import javax.xml.ws.soap.MTOMFeature;

public class Main {
  public static void main(String[] args) {
    String FOO = "FOO";
    MtomService service = new MtomService()
    MtomPortType port = service.getMtomPortTypePort(new MTOMFeature()); 
    String result = null;
    result = port.echoBinaryAsString(FOO.getBytes());
    System.out.println( "Got result: " + result );
  }
}

添付ファイルのしきい値の設定

xs:binary64 データをインラインまたは添付ファイルとして送信する場合に指定する添付ファイルのしきい値を設定できます。デフォルトの添付ファイルのしきい値は 0 バイトです。すべての xs:binary64 データは添付ファイルとして送信されます。

添付ファイルのしきい値を設定する方法は以下のとおりです。

  • Web サービスで、threshold 属性を @java.xml.ws.soap.MTOM アノテーションに渡す。次に例を示します。

    @MTOM(threshold=3072)
    
  • Web サービスのクライアントで、しきい値を javax.xml.ws.soap.MTOMFeature に渡す。次に例を示します。

    MtomPortType port = service.getMtomPortTypePort(new MTOMFeature(3072));
    

上のどちらの例でも、メッセージが 3KB 以上だと添付ファイルとして送信されます。それ以外の場合、コンテンツは SOAP メッセージ本文の一部としてインラインで送信されます。

SOAP 添付ファイルのストリーミング


注意 :

com.sun.xml.ws.developer.StreamingDataHandler API は、(https://jax-ws-architecture-document.dev.java.net/nonav/doc/com/sun/xml/ws/developer/StreamingAttachment.html を参照。) Sun Microsystems が提供する JAX-WS RI の拡張としてサポートされています。この API は WebLogic ソフトウェアの一部としては提供されないため、変更される可能性があります。

MTOM と、javax.activation.DataHandler およびcom.sun.xml.ws.developer.StreamingDataHandler API を使用すると、添付ファイルを含む着信 SOAP メッセージを読み込む際に、デフォルト動作としてメッセージ全体をメモリに読み込む代わりに、Web サービスでストリーミング API を使用することを指定できます。この機能を使用すると、非常に大きい SOAP メッセージを読み込む際の Web サービスのパフォーマンスを向上させることができます。


注意 :

ストリーム MTOM はメッセージの暗号化と組み合わせて使用できません。

以降の節では、クライアント サイドおよびサーバ サイドで SOAP 添付ファイルのストリーミングを使用する方法について説明します。

クライアント サイドのサンプル

次のサンプルでは、クライアント サイドで SOAP 添付ファイルのストリーミングを使用する方法を示します。

package examples.webservices.mtomstreaming.client;

import java.util.Map;
import java.io.InputStream;
import javax.xml.ws.soap.MTOMFeature;
import javax.activation.DataHandler;
import javax.xml.ws.BindingProvider;
import com.sun.xml.ws.developer.JAXWSProperties;
import com.sun.xml.ws.developer.StreamingDataHandler;

public class Main {
   public static void main(String[] args) {
      MtomStreamingService service = new MtomStreamingService();
      MTOMFeature feature = new MTOMFeature();
      MtomStreamingPortType port = service.getMtomStreamingPortTypePort(
         feature);
      Map<String, Object> ctxt=((BindingProvider)port).getRequestContext();
      ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192);
      DataHandler dh = new DataHandler(new
                  FileDataSource("/tmp/example.jar"));
      port.fileUpload("/tmp/tmp.jar",dh);

      DataHandler dhn = port.fileDownload("/tmp/tmp.jar");
      StreamingDataHandler sdh = {StreamingDataHandler)dh;
      try{
         File file = new File("/tmp/tmp.jar");
         sdh.moveTo(file);    
         sdh.close();
       }
       catch(Exception e){
          e.printStackTrace();
       }
  }
}

このサンプルでは以下を行っています。

  • Web サービスのクライアントで MTOM を有効にし、Web サービスのプロキシまたはディスパッチの作成時にパラメータとして javax.xml.ws.soap.MTOMFeature を渡す。

  • MTOM ストリーミング クライアントでの HTTP チャンクを有効にすることで、HTTP ストリーミングのサポートをコンフィグレーションする。

    Map<String, Object> ctxt = ((BindingProvider)port).getRequestContext();
       ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192);
    
  • port.fileUpload メソッドを呼び出す。

  • DataHandlerStreamingDataHandler にキャストし、StreamingDataHandler.readOnce() メソッドを使用して添付ファイルを読み込む。

サーバ サイドのサンプル

次のサンプルでは、サーバ サイドで SOAP 添付ファイルのストリーミングを使用する方法を示します。

package examples.webservices.mtomstreaming;

import java.io.File;
import java.jws.Oneway;
import javax.jws.WebMethod;
import java.io.InputStream;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlMimeType;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.soap.MTOM;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import com.sun.xml.ws.developer.StreamingAttachment;
import com.sun.xml.ws.developer.StreamingDataHandler;

@StreamingAttachment(parseEagerly=true, memoryThreshold=40000L)
@MTOM
@WebService(name="MtomStreaming", 
            serviceName="MtomStreamingService",
            targetNamespace="http://example.org",
            wsdlLocation="StreamingImplService.wsdl")
@Oneway
@WebMethod
public class StreamingImpl {

   // @XmlMimeType を使用してクライアント サイドに DataHandler をマップします
   public void fileUpload(String fileName,
                          @XmlMimeType("application/octet-stream") 
                          DataHandler data) {
      try {
            StreamingDataHandler dh = (StreamingDataHandler) data;
            File file = new File(fileName);
            dh.moveTo(file);
            dh.close();
      } catch (Exception e) {
            throw new WebServiceException(e);
   }

  @XmlMimeType("application/octet-stream")
  @WebMethod
  public DataHandler fileDownload(String filename)
  {
    return  new DataHandler(new FileDataSource(filename));
  }
}

このサンプルでは以下を行っています。

  • ストリーム SOAP 添付ファイルをコンフィグレーションするには、@StreamingAttachement アノテーションを使用します。詳細については、「SOAP 添付ファイルのストリーミングのコンフィグレーション」を参照してください。

  • DataHandler をマップするため、@XmlMimeType アノテーションを以下のように使用する。

    • WSDL から始める場合は、生成された SEI で xmime:expectedContentTypes="application/octet-stream"DataHandler にマップするために使用する。

    • Java から始める場合は、生成された WSDL で適切なスキーマ タイプを生成するために使用する。

  • DataHandlerStreamingDataHandler にキャストし、StreamingDataHandler.moveTo(File) メソッドを使用して添付されたコンテンツをファイルに格納する。

SOAP 添付ファイルのストリーミングのコンフィグレーション

クライアント サイドおよびサーバ サイドでの SOAP 添付ファイルのストリーミングは、以下を指定することでコンフィグレーションできます。

  • 大きな添付ファイルを格納するディレクトリ。

  • ストリーミング添付ファイルを徹底的に解析するかどうか。

  • メモリに格納できる添付ファイルの最大サイズ (バイト)。添付ファイルのサイズが指定したバイト数を超える場合はファイルに書き込まれます。

サーバで SOAP 添付ファイルのストリーミングのコンフィグレーション


注意 :

com.sun.xml.ws.developer.StreamingAttachment API は、(https://jax-ws-architecture-document.dev.java.net/nonav/doc/com/sun/xml/ws/developer/StreamingAttachment.html を参照。) Sun Microsystems が提供する JDK 6.0 の拡張としてサポートされています。この API は JDK 6.0 キットの一部としては提供されないため、変更される可能性があります。

サーバで SOAP 添付ファイルのストリーミングをコンフィグレーションするには、エンドポイント実装で @StreamingAttachment アノテーションを追加します。次のサンプルでは、ストリーミング添付ファイルを徹底的に解析することを指定し、メモリのしきい値を 4MB に設定しています。4MB 以下の添付ファイルはメモリに格納されます。

... 
import com.sun.xml.ws.developer.StreamingAttachment; 
import javax.jws.WebService;

@StreamingAttachment(parseEagerly=true, memoryThreshold=4000000L) 
@WebService(name="HelloWorldPortType", serviceName="HelloWorldService")
public class StreamingImpl {
}

クライアントでの SOAP 添付ファイルのストリーミングのコンフィグレーション


注意 :

com.sun.xml.ws.developer.StreamingAttachmentFeature API は、(https://jax-ws-architecture-document.dev.java.net/nonav/doc/com/sun/xml/ws/developer/StreamingAttachment.html を参照。) Sun Microsystems が提供する JDK 6.0 の拡張としてサポートされています。この API は JDK 6.0 キットの一部としては提供されないため、変更される可能性があります。

クライアントで SOAP 添付ファイルのストリーミングをコンフィグレーションするには、StreamingAttachmentFeature オブジェクトを作成し、PortType スタブ実装の作成時に引数として渡します。次のサンプルでは、大きなファイルを格納するディレクトリを /tmp に設定し、ストリーミング添付ファイルを徹底的に解析することを指定した上で、メモリのしきい値を 4MB に設定しています。4MB 以下の添付ファイルはメモリに格納されます。

... 
import com.sun.xml.ws.developer.StreamingAttachmentFeature; 
...
MTOMFeature mtom = new MTOMFeature();
StreamingAttachmentFeature stf = new StreamingAttachmentFeature("/tmp", true, 4000000L); 
MtomStreamingService service = new MtomStreamingService();
MtomStreamingPortType port = service.getMtomStreamingPortTypePort(
         mtom, stf); 
...