ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの開発
12c (12.1.2)
E48039-03
  目次へ移動
目次

前
 
次
 

16 Fast Infosetを使用したXML転送の最適化

この章では、Java API for XML Web Services (JAX-WS)を使用したWebLogic WebサービスにFast Infosetを使用する方法について説明します。

この章の内容は次のとおりです:

Fast Infosetの概要

Fast Infosetは圧縮されたバイナリ・エンコーディング・フォーマットで、テキストベースのXMLフォーマットより効率的にシリアライズできます。Fast Infosetでは、ドキュメント・サイズと処理パフォーマンスの両方が最適化されます。

Fast Infosetが有効な場合、データが送信される前に、SOAPエンベロープ内のXML情報セットは、圧縮されたバイナリ・フォーマットに変換されます。Fast Infosetでは、暗号化メッセージ、署名されたメッセージ、MTOM対応メッセージおよびSOAP添付ファイルが最適化され、HTTPとJMSの両方のトランスポートがサポートされます。

Fast Infosetの仕様、ITU-T Rec.X.891 and ISO/IEC 24824-1 (Fast Infoset)は、ITU-TとISOの両方の標準化団体で定義されています。この仕様は、ITU Webサイト、http://www.itu.int/rec/T-REC-X.891-200505-I/enからダウンロードできます。

Fast Infoset機能は、すべてのWebサービスにおいて、デフォルトで有効です。Webサービス・クライアントの場合、Fast Infosetは、Webサービスで有効化されWSDLで通知されている場合にのみ有効となります。

Fast Infosetは、Webサービスまたはクライアントで、明示的に有効化および構成できます。これについて、次の項で説明します。

WebサービスでのFast Infosetの有効化

Fast Infoset機能は、デフォルトで、Webサービスで有効化され、WSDLに通知されています。次のいずれかの方法を使用することにより、WebサービスでFast Infosetを明示的に有効にできます。

設計時に@FastInfosetServiceアノテーションを使用する例

次のコードの抜粋は、com.oracle.webservices.api.FastInfosetServiceアノテーションを使用して、設計時にWebサービスでFast Infosetを有効化および構成する例です。

package examples.webservices.hello_world;
import javax.jws.WebService;
import com.oracle.webservices.api.FastInfosetService;
 
@WebService(name="HelloWorldPortType", serviceName="HelloWorldService")
@FastInfosetService(enabled=true)
 
public class HelloWorldImpl {
  public String sayHelloWorld(String message) {
  try {
    System.out.println("sayHelloWorld:" + message);
  } catch (Exception ex) { ex.printStackTrace(); }
    return "Message from FI Enabled Service: '" + message + "'"; 
  }
}

Webサービス・クライアントでのFast Infosetの有効化および構成

次のいずれかの方法を使用することにより、Webサービス・クライアントでFast Infosetを明示的に有効化および構成できます。

コンテンツ・ネゴシエーション戦略の構成

Fast Infosetがクライアントで有効な場合は、コンテンツ・ネゴシエーション・ポリシーの構成が可能です。表16-1で、com.oracle.webservices.api.FastInfosetContentNegotiationTypeによって定義される有効なコンテンツ・ネゴシエーション戦略について説明します。

表16-1 コンテンツ・ネゴシエーション戦略

説明

OPTIMISTIC

Fast Infosetがサービスで有効と見なします。すべてのリクエストがFast Infosetを使用して送信されます。

PESSIMISTIC

クライアントからの最初のリクエストは、Fast Infosetを有効にするのではなく、クライアントでFast Infoset機能がサポートされていることを示すHTTP受入れヘッダーを使用して送信されます。サービス・レスポンスがFast Infosetフォーマットで、サービスでFast Infosetが有効であることが確認されると、クライアントからの後続のリクエストはFast Infosetフォーマットで送信されます。

NONE

クライアント・リクエストではFast Infosetは使用されません。


次の点に注意してください。

  • コンテンツ・ネゴシエーション戦略がクライアントで明示的に構成されている場合:

    • WSDLで通知されているネゴシエーション戦略より優先されます。

    • 構成されているコンテンツ・ネゴシエーション戦略が、サービスにより通知されている機能と競合する場合(クライアントでOPTIMISTICが構成され、サービスでFast Infosetが無効にされている場合など)は、例外が生成されます。

  • コンテンツ・ネゴシエーション戦略がクライアントで明示的に構成されていない場合:

    • Fast Infosetがサービスで有効化および通知されている場合、OPTIMISTICコンテンツ・ネゴシエーション戦略が使用されます。

    • Fast Infosetがサービスで無効化され、通知されていない場合、NONEコンテンツ・ネゴシエーション戦略が使用されます。

設計時にFastInfosetClientFeature機能クラスを使用する例

次のコードの抜粋は、com.oracle.webservices.api.FastInfosetClientFeature機能クラスを使用して、設計時にWebサービスでFast Infosetを有効化および構成する例です。

package examples.webservices.hello_world.client;
 
import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import java.net.URL;
import com.oracle.webservices.api.FastInfosetClientFeature;
import com.oracle.webservices.api.FastInfosetContentNegotiationType;
 
public class Main {

public static void main(String[] args) {
    HelloWorldService service;
    FastInfosetContentNegotiationType clientNeg  = 
        FastInfosetContentNegotiationType.PESSIMISTIC;
    FastInfosetClientFeature feature =
FastInfosetClientFeature.builder().fastInfosetContentNegotiation(clientNeg).enabled(true).build();
          try {
      service = new HelloWorldService(new URL(args[0] + "?WSDL"), new QName("http://hello_world.webservices.examples/", "HelloWorldService") );
    } catch (MalformedURLException murl) { throw new RuntimeException(murl); }
      HelloWorldPortType port = service.getHelloWorldPortTypePort(feature);
 
      String result = null;
      result = port.sayHelloWorld("Hi there!");
      System.out.println( "Got result: " + result );
  }
}

WebサービスおよびクライアントでのFast Infosetの無効化

設計時にFast Infosetを明示的に無効にするには次のようにします。

次のコードの抜粋は、com.oracle.webservices.api.FastInfosetServiceアノテーションを使用して、設計時にWebサービスでFast Infosetを無効化する例です。

package examples.webservices.hello_world;
import javax.jws.WebService;
import com.oracle.webservices.api.FastInfosetService;
 
@WebService(name="HelloWorldPortType", serviceName="HelloWorldService")
@FastInfosetService(enabled=false)
 
public class HelloWorldImpl {
  public String sayHelloWorld(String message) {
  try {
    System.out.println("sayHelloWorld:" + message);
  } catch (Exception ex) { ex.printStackTrace(); }
    return "Message from FI Enabled Service: '" + message + "'"; 
  }
}

デプロイメント後にFast Infosetを無効にするには次のようにします。