...

Webサービス ~Application~ 1 日本IBMシスエムズ・エンジニアリング(株)

by user

on
Category: Documents
122

views

Report

Comments

Transcript

Webサービス ~Application~ 1 日本IBMシスエムズ・エンジニアリング(株)
Webサービス
~Application~
日本IBMシスエムズ・エンジニアリング(株)
Webインフラストラクチャー
平岩 梨果
© 2008 IBM Corporation
1
Disclaimer
WAS
WAS V7
V7 W/S
W/S
当資料で提供する技術情報は、各製品の出荷前コードに基づくものを含みます。
この資料は日本アイ・ビー・エム株式会社ならびに
日本アイ・ビー・エム システムズ・エンジニアリング株式会社の正式なレ
ビューを受けておりません。
当資料は、資料内で説明されている製品の仕様を保証するものではありません。
資料の内容には正確を期するよう注意しておりますが、この資料の内容は2008年
10月現在の情報であり、製品の新しいリリース、PTFなどによって動作、仕様が変
わる可能性があるのでご注意下さい。
今後国内で提供されるリリース情報は、対応する発表レターなどでご確認くださ
い。
WebSphere Application Server V7
Announcement Workshop 2008
#2
© IBM Corporation.
2
Agenda
WAS
WAS V7
V7 W/S
W/S
WASとWebサービス
Webサービスの動向と最新仕様
Webサービスのインターオペラビリティ(相互運用性)
メッセージ交換パターンとトランスポートプロトコル
JAX-WSのプログラミングモデル
Standard SOAP/JMSのサポート
MTOM (Message Transmission Optimization Mechanism)-
WebSphere Application Server V7
Announcement Workshop 2008
#3
© IBM Corporation.
3
WASとWebサービス
WebSphere Application Server V7
Announcement Workshop 2008
WAS
WAS V7
V7 W/S
W/S
#4
© IBM Corporation.
4
SOAのリファレンス・アーキテクチャにみるWASのポジショニング
WAS
WAS V7
V7 W/S
W/S
ビジネス・イノベーション&最適化サービス
リアルタイムでのビジネス情報による、よりよい意志決定の促進
開発
サービス
ソリューション
資産のデザ
インと構築
のため
の統合環境
インタラクション
・サービス
ビジネス・プロセスの自動化
と統合・調整
人・プロセス・情報の
コラボレーション
ESB
パートナー・サービス
企業間接続
インフォメーション
・サービス
プロセス・サービス
多様なデータやコンテンツの
統一管理
確実なサービ
スやアプリケー
ション、リソー
スの管理
サービス間の接続
ビジネス・アプリケーション
・サービス
堅牢でスケーラブルかつ
セキュアなサービス実行環境
IT
サービス
管理
アクセス・サービス
既存の情報やアプリケーション
資産との接続の促進
インフラストラクチャ・サービス
スループット、可用性、パフォーマンスの最適化
WASが担うのは、“サービス”の実行環境
WebSphere Application Server V7
Announcement Workshop 2008
#5
© IBM Corporation.
上図はSOAのリファレンス・アーキテクチャになります。SOAを実現するうえで必要となるさま
ざまな役割をまとめていますが、そのなかで、WASはビジネス・アプリケーション・サービスすな
わちサービスの実行環境を担っています。また、プロセス・サービスを担うWPSや、ESBの責
務を担うWESBといった製品もWASをベースにしており、今回紹介するWASのWebサービス
の機能が、これらの製品のベースのテクノロジーになっています。
※WASをベースにした製品の出荷は、WASと同じタイミングで最新バージョンが出荷されな
いことにご注意ください。
5
Webサービスでできること
WAS
WAS V7
V7 W/S
W/S
異機種で接続できる(Javaと.NETなど)
プラットフォームや言語に依存しない
接続性
クライアントだけではなく、
コンピュータ同士の利用を前提
再利用
Web
サービス
CICS
(COBOL)
Web
サービス
共通ロジック
WAS
(Java)
Web
サービス
・NET
標準のインターフェース定義
WSDL
異機種間をつなぐ相互運用性
WS-I
非機能要件を実現する標準仕様
WS-*
WebSphere Application Server V7
Announcement Workshop 2008
#6
© IBM Corporation.
Webサービスの特徴について確認します。
SOAで重要なキーワードとなる再利用性を実現するために、Webサービスの接続性という特
徴がとても重要になります。接続性の主なポイントとしては、異機種でつなぐことができたり、ま
たプラットフォームや言語に依存しないといったことが挙げられます。またコンピューター同士
が利用することを想定しているため、人手を介さない自動処理を可能にしています。
また、Webサービスの接続性を可能にしている代表的なテクノロジーがあります。
1:WSDLというインターフェース記述言語を使用しています。
人間もコンピューターにも理解できるXML形式であること。また、明確にインターフェース
定義が決められています。
2:異機種との接続性は、WS-Iという標準化団体の活動によって維持されています。
この団体は、Webサービスの相互運用性を推進するための団体で、プロファイルを提供し
ています。プロファイルについては後述します。
3:非機能要件を実現するための標準仕様としてWS-*があります。WS-*については後述しま
す。
6
Webサービスアプリケーションの基本
WAS
WAS V7
V7 W/S
W/S
Webサービスアプリケーションの特徴
通信メッセージフォーマットはXML(SOAP)
トランスポートプロトコルからは独立
WSDLを使用してリクエスターやプロバイダーコードの自動生成が可能
Webサービスリクエスター/プロバイダーの開発の仕様
JAX-RPC(1.1)とJAX-WS(2.0/2.1)
WSDLとJavaとの
マッピング規定
●実装からWSDLの自動生成
開発
●WSDLから通信用Javaクラスの自動生成
リクエスター
実行
JAX-RPC
JAX-WS
SOAP
プロバイダー
トランスポートに
依存しない
WebSphere Application Server V7
Announcement Workshop 2008
JAX-RPC
JAX-WS
#7
© IBM Corporation.
Webサービスアプリケーションの基本的な特徴について、もう少しテクノロジーの観点からみ
ていきましょう。
まず、メッセージ・フォーマットとしてSOAPを利用しているので、特定の通信プロトコルに依存
することはありません。
主要な技術の記述言語として、技術に対して中立的であるXMLを利用することによって、特
定技術への依存性を排除しています。
インターフェース言語であるWSDLを利用して、ツールによるリクエスターやプロバイダーア
プリケーションの自動生成が可能という特徴があります。
Webサービスの仕様としては、JAX-RPCとその後継であるJAX-WSがあります。JAXWS(2.0)はWAS V6.1FeaturePack for WebServices(以降 WAS V6.1 FPWS)からサ
ポートされ、さらに、WAS V7では、JAX-WS2.1という最新バージョンをサポートしています。
JAX-RPC仕様のバージョンが1.1から2.0に上がると同時に、その名前がJAX-WSに変更に
なっているのは、JAX-RPC仕様が網羅するのはRPCだけではないこと、Webサービスのため
のJava APIであることを明確にするための名称変更です。 JAX-RPCからJAX-WSへの変遷
については、後ほど詳細にご紹介します。
7
Webサービスにおける非機能要件の実現
WAS
WAS V7
V7 W/S
W/S
分散コンピューティング環境では非機能要件が特に重要
WS-*
非機能要件を実現する標準仕様
アプリケーションではなくミドルウェアのレベルで実現
A社
Internet
B社
SOAP/HTTP
リクエスター
プロバイダー
分散環境における
非機能要件の実現
トランザクション処理の
整合性をとりたい!
非機能要件を実現するWS-*の例
非機能要件を実現するWS-*の例
信頼性
WS-ReliableMessaging….
セキュリティ
WS-Security,WS-SecureConversation…
運用管理
WS-Policy,WS-DistributedManagement…
トランザクション
WS-AtomicTransaction,WS-BusinessActivity…
WebSphere Application Server V7
Announcement Workshop 2008
#8
© IBM Corporation.
WebサービスにはアプリケーションのAPIだけではなく、非機能要件を実現するための標準
仕様が用意されています。
インターネットを介した分散コンピューティング環境では、特に非機能要件を考慮することが
重要になります。また、基幹システムの構築を考えた場合にも、機能要件と同じくらい非機能
要件を重要視する必要があるでしょう。例えば、トランザクションの保証を運用での回避やアプ
リケーションの作りこみによって行ったり、セキュリティーや信頼性の確保をトランスポートレベ
ルに依存したSSLで実現することも可能です。しかし、こういった依存性の強いアプリケーショ
ンを増やすことは、アプリケーションの再利用性の観点からもあまり好ましくありません。Web
サービスには、こういった非機能要件を実現するためにWS-*と呼ばれる標準仕様が定められ
ています。WS-*には、信頼性やセキュリティ、運用管理、トランザクションといったカテゴリーに
マッピングされた各種仕様が多くあります。WS-*という技術を使用することは、機能以外のこと
をアプリケーションレイヤーで実装したり、また特定のトランスポートプロトコルに依存するので
はなく、ミドルウェアのレイヤーで実現することにつながります。
8
(参考)Webサービス仕様群のなかのWS-*
WAS
WAS V7
V7 W/S
W/S
Web Service Specifications – Organized Overview
Quality of Service(QoS) ・・・・非機能要件の一部である品質・性能
WS-Reliable
Messaging
WS-TX
(WS-AT,WS-BA)
WS-Policy
WS-Security
WS-SC
WebSphere Application Server V7
Announcement Workshop 2008
#9
© IBM Corporation.
これはWebサービス仕様群のなかのWS-*が位置するレイヤーを示したものです。
Webサービス仕様のレイヤーの中で、WS-*は主にQuality of Serviceを支えるテク
ノロジーになります。Quality of Service(QoS)は非機能要件のなかでも特に品質・
性能を指します。この部分については、この後のセッションWebservice QoS &
Policyで扱います。
9
WASがサポートするWebサービス仕様の変遷
WAS
WAS V7
V7 W/S
W/S
WAS V7でサポートするWebサービス(Application)関連の仕様
JSR 109 1.2
JAX-WS 2.1
New
v7
JAXB 2.1
EJB 3.0*
WebSphere 6.1
Feature Pack for
Web Services
Webサービス実装
MTOM
WebSphere 6.1
WebSphere 6.0
WebSphere 5.1
JAX-RPC (JSR-101)
1.0
JSR-109 1.0
SAAJ 1.1
WS-Security (draft)
WS-I Basic Profile 1.0
UDDI4J version 2.0
(client)
Apache Soap 2.3
enhancements
JAX-RPC (JSR-101)
1.1
JSR-109 1.1 – WSEE
1.1
SAAJ 1.2
WS-Security 1.0
WS-I Basic Profile 1.1
UDDI 3.0
JAXR
WS-TX AT Support
WebSphere 7.0
当セッションで紹介
WS-TX BusinessActivity
WS-I BSP 1.0
WS-Notification
WS-Security
(performance)
SOAP/JMS performance
WS-RF (Resource
Framework)
WS-Addressing (SOAP /
Core)
JAXB 2.0
JAX-WS 2.0
StAX 1.1
SAAJ 1.3
SOAP 1.2
MTOM / XOP
WSSecureConversation
WS-Trust
WSReliableMessaging
WSDistributedManagem
ent (WSDM)
JAXB 2.1
JAX-WS 2.1
JSR 109 1.2
EJB3.0
OASIS WS-TX (AT/BA)
OASIS WS-SX
WSSecureConversation
WS-Trust
WS-SecurityPolicy
OASIS Kerberos Token
Profile
W3C WS-Policy
W3C WS-Addressing
Metadata
WS-MetadataExchange
WS-I BP 1.2 / 2.0 / RSP
※当資料では、Feature Pack for Web Services をV6.1 FPWSと表記
WebSphere Application Server V7
Announcement Workshop 2008
# 10
© IBM Corporation.
WASがサポートしているWebサービス仕様群の変遷になります。Webサービスの標準仕様
は数多く存在しますが、WASがサポートしている仕様は、ここに記されている仕様になります。
WAX V7では、Webサービスのアプリケーション関連の仕様として、新たにいくつかの仕様
の最新バージョンをサポートしています。
WebサービスのAPIであるJAX-WSは、V6.1 FPWSでは2.0でしたが、V7より2.1をサポート
しています。また、XMLとJavaオブジェクトのバインディングのAPIであるJAXBは、 jJAX-WS
と同様V6.1 FPWSでは2.0でしたが、V7より2.1をサポートします。Webサービスのディプロイ
やパッケージングの方法などを定めたImplementing Enterprise WebServices
(WebServices for Java EE)は、 V6.1 FPWSでは1.1(JSR921)でしたが、V7より1.2
(JSR109)をサポートします。EJB3.0に関しては午前のセッションで扱いましたが、EJB実装
のWebサービスもサポートされています。このセッションではこれらの仕様について解説してい
きます。またMTOMについては、 V6.1 FPWSからサポートされていますが、概要についての
説明、およびJAX-WS2.1によって新規に追加された実装コードについて紹介します。
10
Webサービスの動向と最新仕様
WebSphere Application Server V7
Announcement Workshop 2008
WAS
WAS V7
V7 W/S
W/S
# 11
© IBM Corporation.
11
Webサービスの仕様と変遷(JAX-RPCからJAX-WSへ)
WAS
WAS V7
V7 W/S
W/S
Webサービスリクエスター/プロバイダーの開発の仕様
JAX-RPC(1.1)とJAX-WS(2.0/2.1)
RPCスタイルのJAX-RPCからメッセージ指向のJAX-WSへ
RPCスタイルが主流であったWebサービス仕様がメッセージ指向の取り込み
JAX-WSでは、非同期呼び出しを含めたメッセージ交換パターンの明確化
JAX-WS
(2.0/2.1)
W eb S
ervice
・WebサービスのためのJava
API
・RPCだけではない
Async
Messaging
Messaging
RPC
・ネットワーク上の別プログラム
の機能を自機能同様にコール
・同期呼出し
JAX-RPC
(1.1)
・MOM(メッセージ指向ミドルウェア)
によるN対N統合
・非同期呼出し
メッセージング
WebSphere Application Server V7
Announcement Workshop 2008
# 12
© IBM Corporation.
分散コンピューティングの歴史は、大きく分けて、 RPCスタイルの同期呼び出しとメッセージ
ングによる非同期呼出しに分かれています。RPCは、Remote Procedure Call という名前の
通り、ネットワーク上の別プログラムの機能をローカル上の機能と同様にコールするという技術
で、同期呼出しを基本にしています。もう1つはメッセージ指向ミドルウェア(MOM)製品を利
用したメッセージングの概念になり、非同期処理を実現しています。 RPCスタイルが主流で
あったWebサービス仕様(JAX-RPC)がメッセージ指向を取り込み、JAX-WSという仕様に発
展しています。JAX-WSでは、非同期を含めたメッセージ交換パターンを明確に定義していま
す。
12
JAX-WS2.1(1/2)
WAS
WAS V7
V7 W/S
W/S
JAX-WS(JSR224 Java API for XML-Based Web Services) 2.1
JAX-RPCに替わるJava Webサービスの新規API
従来の同期型に加え、非同期プログラミングモデルをサポート
新Webサービス標準のサポート
SOAP1.2、MTOM、SAAJ1.3、JSR109 (WebServices for Java EE) v1.2
SAAJ1.3
SOAPメッセージの構築・操作
パッケージングやデプロイ、実装方式の規定
JSR109
リクエスター
JAXB
JAXB
SOAP
1.1/1.2
JAXB
JAXB
プロバイダー
アタッチメント
非同期プログラミングを規定
MTOM
WebSphere Application Server V7
Announcement Workshop 2008
# 13
© IBM Corporation.
JAX-WSは、正式名称をJSR224 Java API for XML Based Web Servicesといいます。
JAX-RPCの後継にあたる仕様になります。繰り返しになりますが、従来の同期型に加えて、非
同期呼び出しのプログラミングを新たにサポートしています。JAX-WSの非同期呼び出しの詳
細については、後述します。
また、新しいWebサービス関連の仕様をサポートしています。SOAP1.2は、SOAPの最新
バージョンになります。MTOM(SOAP Message Transmission Optimization Mechanism)
はW3Cにより作成された標準で、Webサービスでバイナリデータ(添付ファイル)をやりとりす
るための仕様になります。SAAJ (SOAP with Attachments API for Java) はSOAPメッセー
ジの作成、読み込み、変更を行うためのAPIになります。今回はSAAJについては触れていま
せんが、SAAJについては『WAS V6.1 SOA Webサービス・ワークショップ』の「JAX-WSによ
るメッセージ指向プログラミング」 を参考にしてください。JSR109 V1.2については、後述しま
す。
13
JAX-WS2.1(2/2)
WAS
WAS V7
V7 W/S
W/S
JAX-WS(JSR224 Java API for XML-Based Web Services) 2.1
仕様からJava-XMLデータバインディング規定を分離し、JAXBへ委譲
XMLドキュメントをJavaで扱うための変換処理
アノテーション・サポートによる開発効率・保守効率の向上
ベンダー依存のWebサービスDD/マッピングファイルの排除
JSR181 WebServices Metadata、JSR175 Metadata Facility for Java、JSR250 Common
Annotation
SOAPだけではなく、XML/HTTPバインディングのサポート
ベンダー依存の静的スタブによるプログラミングモデルの排除
JavaとXMLのマッピング
はJAXB仕様に委譲
リクエスター
JAXB
JAXB
XML/HTTP
バインディング
SOAP
/XML
JAXB
JAXB
JAX-WS
プログラミングAPI
WS Metadata
アノテーション
プロバイダー
アノテーションでの
サービス定義
WebSphere Application Server V7
Announcement Workshop 2008
# 14
© IBM Corporation.
JAX-RPCはXMLとJavaのバインディングにおいて独自の実装で行っていましたが、JAXWSでは、JAXBという仕様にその部分を完全に委譲しています。
JAX-WSでは、Web Services Metadata(JSR-181)という仕様をサポートしたことで、アノ
テーションによる定義が可能になっています。JSR-181で定義されたアノテーションをPOJO
なサービスオブジェクトに施すことにより、 従来のWebサービスコンポーネントに必要なリモー
トインターフェイス、WSDLファイル、デプロイメント・ディスクリプター(webservices.xml)、およ
びJAX-RPCマッピングファイルに相当する情報を自動生成することができるようになります。
また、JAX-WSはSOAP/HTTPバインディングだけはなく、XML/HTTPバインディングをサ
ポートしています。Javaオブジェクトではなく、XMLそのものを扱いたい場合には、
XML/HTTPバインディングを使用することになります。
14
JAXB2.1
WAS
WAS V7
V7 W/S
W/S
JAXB(Java Architecture for XML Binding) 2.1
JavaクラスとXMLスキーマのデータバインディングを行う仕様
XMLスキーマに準拠し、スキーマ検証をサポート
XMLスキーマ<->Javaオブジェクト
XML文書<->Javaオブジェクト
JAX-WS2.1におけるデフォルトのデータバインディング仕様
開発
オプションでスキーマ検証が可能!
XML
XML
実行
ドキュメント
ドキュメント
スキーマ
ジェネレーター
(schemagenコマンド)
アンマーシャル
XML
XML
Javaオブジェクト
スキーマ
スキーマ
スキーマ
コンパイラー
(xjcコマンド)
Javaクラス
マーシャル
annotation
WebSphere Application Server V7
Announcement Workshop 2008
XML
XML
ドキュメント
ドキュメント
# 15
© IBM Corporation.
JAXBは、XMLドキュメントをJavaオブジェクトとして扱うために、XMLスキーマをJava のクラ
スにマッピングすることによってアプリケーションの開発効率を向上させるためのツールやAPI
をまとめたアーキテクチャです。スキーマとは、XMLドキュメントの中でどのようなタグを使用し
ているか,属性は何かなどを定義しています。
XMLドキュメントをメモリー上のJavaオブジェクトに対応付けることをマーシャル、またJavaオ
ブジェクトからXMLドキュメントを作成することをアンマーシャルと言います。この作業において、
XMLスキーマを利用していることがJAXBの特徴になります。
開発時には、XMLスキーマとJavaのクラスの関係付け(バインディング)をおこなっておくこと
によって、XMLドキュメントとJavaのオブジェクトの対応関係を明確にすることが可能になりま
す。Javaのオブジェクトに対するクラスの関係は,XMLドキュメントに対するスキーマと同じに
なります。
基本的な流れは下記のようになります。
1.Unmarshal:XMLのドキュメントをJavaに読み込んで、Javaでの表現に変換する
2.Access & update:Javaでの表現にアクセスして、内容を変更する
3.Marshal:JavaでのXMLの表現を、再び、XMLに変換する
またJAXB は、xjcスキーマ・コンパイラー・ツール、 schemagen スキーマ・ジェネレーター・
ツール、およびランタイム・フレームワークを提供します。 xjc スキーマ・コンパイラー・ツールで
は、XML スキーマ定義 (XSD) から開始して、 XSD スキーマに定義されたエレメントおよびタ
イプにマッピングする JavaBeans セットを作成することができます。また、JavaBeans セット
から開始し、 schemagen スキーマ・ジェネレーター・ツールを使用して XML スキーマを作成
することもできます。スキーマ・コンパイラーまたはスキーマ・ジェネレーター・ツールのいずれ
かを使用した後、 XMLドキュメントを Java オブジェクトとの間で双方向に変換し、その結果で
ある Java クラスを使用して Web サービスのアプリケーションをアセンブルすることができます。
15
JAXBによるデータバインディングのいいところ①
WAS
WAS V7
V7 W/S
W/S
複合型データ・タイプのマッピング
<xsd:sequence>の順序情報がアノテーションで反映
JAXB
JAX-RPC
@XmlType(name = "Phone", propOrder = {
"areaCode",
"exchange",
"number"
})
public class Phone {
public class Phone {
private String areaCode;
private String exchange;
private String number;
@XmlElement(required = true)
protected String areaCode;
@XmlElement(required = true)
protected String exchange;
@XmlElement(required = true)
protected String number;
...
}
Java型では表現できなかった順序情報
をアノテーションで定義
WebSphere Application Server V7
Announcement Workshop 2008
# 16
© IBM Corporation.
JAXBの主なメリットを取り上げていきます。まず1つ目ですが、複合型(ComplexType)の
マッピングにおいて、XMLスキーマで<xsd:sequence>で定義された順序情報をアノテーショ
ンで表現することが可能になりました。JAX-RPCでは、これらの要素名をJava型のフィールド
に変換する際、順序性を維持することができませんでしたが、JAXBでは可能になります。
16
JAXBによるデータバインディングのいいところ②
WAS
WAS V7
V7 W/S
W/S
JAX-RPCではコレクション型が直接使用できない
JAXBはJavaコレクション型のマッピングも可能
List,HashMap,Vector,TreeSet
Generics List型では順序の保持も可能に
JAX-RPC
private int[] intArrayField;
public int[] getIntArrayField() {...}
public void setIntArrayField(int[] intArrayField) {...}
public int getIntArrayField(int i) {...}
public void setIntArrayField(int i, int value) {...}
Generics Listにマッピングすることで
setter/getterがシンプルに
順序も保持可能に
JAXB
@XmlElement(type = Integer.class)
protected List<Integer> intArrayField;
public List<Integer> getIntArrayField() {...}
WebSphere Application Server V7
Announcement Workshop 2008
# 17
© IBM Corporation.
2つ目に、コレクション型(List,HashMap,TreeSet)のサポートが挙げられます。JAX-RPCで
は、コレクション型がサポートされておらず、 xsd:anyTypeにマッピングされてしまうため、コレ
クション型を直接扱うことができませんでした。コレクション型を使わずに配列を利用する、もし
くはサービス・インターフェースとしてラッパークラスを用意する、などの対応が必要でした。
(詳細は、『SOA Webサービス及びESB基盤構築ワークショップ資料』の「4.Webサービス・ア
プリケーション開発設計」を参考にしてください。)JAXBでは、コレクション型のマッピングも可
能です。また、Generics List型では、順序も保持することが可能です。
17
JAXBによるデータバインディングのいいところ③
WAS
WAS V7
V7 W/S
W/S
JAX-RPCの場合
クラスでエレメント(要素)とアトリビュート(属性)の区別がつかない
<xs:complexTypename="address">
<xs:sequence>
<xs:elementname=“name" type="xs:string"
/>
<xs:elementname="street" type="xs:string" />
<xs:elementname="city" type="xs:string" />
<xs:elementname="state" type="xs:string"/>
<xs:elementname="zip" type="xs:string"/>
</xs:sequence>
</xs:complexType>
スキーマでは
<xs:complexTypename="address">
明確に区別
<xs:sequence>
<xs:elementname="street" type="xs:string" />
<xs:elementname="city" type="xs:string" />
<xs:elementname="state" type="xs:string"/
></xs:sequence>
<xsd:attributename="name" type ="xsd:string"/>
<xsd:attributename="zip" type ="xsd:string"/>
</xs:complexType>
スキーマ①
<address
<name=“ISE Hanako”/name>
<street>美浜</street>
<city>幕張</city>
<state>千葉</state>
<zip=“097-0012”/zip>
</address>
XMLドキュメント①
スキーマ②
public class Address {
protected String name;
protected String street;
protected String city;
protected String state;
protected String zip;
}
クラス
<address
name=“ISE Hanako”
zip=“097-0012”>
<street>美浜</street>
<city>幕張</city>
<state>千葉</state>
</address>
XMLドキュメント②
WebSphere Application Server V7
Announcement Workshop 2008
# 18
© IBM Corporation.
3つ目に、要素と属性の区別が可能になったことが挙げられます。まず、JAX-RPCの例です。
XMLドキュメント①では、 name,street,city,state,zipがすべて要素として定義されており、ス
キーマ①でもすべて要素として定義されていることがわかります。 XMLドキュメント②では、
street,city,stateが要素、nameとzipが属性として扱われています。またスキーマ②でも、要素
と属性が区別されていることがわかります。しかしJavaクラスでは、すべてフィールド(field)で
表現されてしまい、要素と属性の判別がつかないことがわかります。
18
JAXBによるデータバインディングのいいところ③
WAS
WAS V7
V7 W/S
W/S
JAXBの場合
アノテーションによる厳密な制約指定
エレメント(要素)とアトリビュート(属性)の区別が可能に
<xs:complexTypename="address">
<xs:sequence>
<xs:elementname="street" type="xs:string" />
<xs:elementname="city" type="xs:string" />
<xs:elementname="state" type="xs:string"/
></xs:sequence>
<xsd:attributename="name" type ="xsd:string"/>
<xsd:attributename="zip" type ="xsd:string"/>
</xs:complexType>
スキーマ
<address
name=“ISE Hanako”
zip=“097-0012”>
<street>美浜</street>
<city>幕張</city>
<state>千葉</state>
</address>
public class Address {
@XmlAttribute
protected String name;
@XmlElement
protected String street
;@XmlElement
protected String city;
@XmlElement
protected String state;
@XmlAttribute
protected String zip;}
クラス
XMLドキュメント
WebSphere Application Server V7
Announcement Workshop 2008
# 19
© IBM Corporation.
JAXBでは、Javaでは失われるXMLの要素もしくは属性のどちらで表現されているのかとい
う情報を、アノテーションを使用することによって、Javaのフィールドに付加することが可能にな
ります。
また、必須指定(Required)や、要素の値を取りあえずブランクにしておきたいケースでは、
対象の要素定義に「nillable=“true”」を記述することも可能です。
@XmlElement(required = true, nillable = true)
protected String stringNilField;
19
Implementing Enterprise WebServices (WebServices for Java
EE)
WAS
WAS V7
V7 W/S
W/S
JSR109 (Implementing Enterprise WebServices)
Java EE環境でのWebサービスの実装方式やパッケージング、デプロイ方
式を規定
WAS V6.1 FPWSでは、V1.1(JSR921)までのサポート
WAS V7(JAX-WS 2.1)より、V1.2(JSR109)をサポート
JSR109 V1.2のハイライト
New
v7
JSR109
JAX-RPC<->JAX-WS間の互換性に関する規定も含まれる
EJB3.0のJAX-WS によるWebサービス実装のサポート
クライアント側のJAX-WSアノテーション(@WebServiceRef,@Resource)のサポート
クライアント側のデプロイメントディスクリプターで、サービス参照の定義が可能
アノテーションで定義されたWSDLファイルのロケーションや、サービス参照の定義
を上書きすることも可能
WebSphere Application Server V7
Announcement Workshop 2008
# 20
© IBM Corporation.
Implementing Enterprise WebServices (WebServices for Java EE)では、Java EE環境
でのWebサービスの実装方式や、パッケージング、デプロイ方式を規定しています。V6.1
FPWSでは、V1.1(JSR921)までのサポートでしたが、V7よりV1.2(JSR109)を新しくサポート
しています。
JSR109 V1.2のハイライトを上記に挙げています。それぞれの項目については、後ほど紹介
していきます。
(参考)
JSR・・・Java標準化機関であるJCP(Java Community Process)で提案されている仕様の
ことで、JCPにてJSRがJava標準にふさわしいかどうかを議論し、ここで選ばれることでJava標
準が決められています。そしてJava標準となったJSRはJavaプラットフォームへ実装されること
になります。
JCP・・・Sun Microsystems社が主催する、Java技術に関する標準仕様を定める機関
JSR109・・・http://jcp.org/en/jsr/detail?id=109
JSR921・・・http://jcp.org/en/jsr/detail?id=921
20
主要なWebサービス関連仕様の流れ
2000
2001
2002
2003
5月
6月
SOAP1.1
SOAP1.2
Note
2004
WAS
WAS V7
V7 W/S
W/S
2005
2006
2007
5月
5月
Recommendation
3月
WSDL1.1
Note
W3C
6月
10月
JAX-RPC1.0 JAX-RPC1.1
JSR101
11月(Java EE1.3)
JSR
JAX-WS2.0 JAX-WS2.1
JSR101
JSR224
1月(Java EE1.4)
JSR224
5月(Java EE5)
WebServices for Java EE1.0
WebServices for Java EE1.1WebServices for Java EE1.2
JSR109
JSR921
JSR109
WAS V6.1でのサポート範囲
WAS V6.1FPWSでのサポート範囲
WAS V7 のサポート
WAS V7でのサポート範囲
JAX-WS2.1 + WSDL1.1 + SOAP1.1/SOAP1.2 + WebServices for Java EE1.2
WebSphere Application Server V7
Announcement Workshop 2008
# 21
© IBM Corporation.
Webサービス関連仕様と、WAS V6.1、WAS V6.1 FPWS、WAS V7におけるサポート状況
を表しています。
現在でもSOAP1.1が主流ですが、SOAP1.2はWAS V6.1 FPWSよりサポートされています。
またWSDLのバージョンは、WAS V6から変わらずWSDL1.1のサポートになります。またWAS
V7では、JAX-WSの最新バージョンである2.1と、Java EE環境でのWebサービスの実装方式
やパッケージング、デプロイ方式を規定しているWebServices for Java EE1.2(JSR109)を
新しくサポートしました。
21
Webサービスのインターオペラビリティ(相互運用性)
WAS
WAS V7
V7 W/S
W/S
WebSphere Application Server V7
Announcement Workshop 2008
# 22
© IBM Corporation.
22
WS-I Basic Profile
WAS
WAS V7
V7 W/S
W/S
Webサービスの基本仕様に関するProfile
相互接続性を向上するために各仕様の明確化と修正を進めた規定
Webサービス基本仕様は厳密でなく、解釈により各製品での実装が異なる
Webサービス基本仕様はバージョンアップ時にWS-Iでの規定を取り込む
WS-I Basic Profile 1.1
2004年8月正式公開
WS-I Basic Profile 1.1のハイライト
エンコーディングはDocument/literalかRPC/Literal
プロトコルバインディングはSOAP/HTTP(HTTPS)
SOAP Faultのレスポンスを受け取ったらHTTP 500を返す。
リクエストはHTTP POSTを使用する
WSDL1.1を使用する
実行環境とアプリケーションの双方がWS-Iに準拠する必要がある
WebSphere Application Server V7
Announcement Workshop 2008
# 23
© IBM Corporation.
WS-Iは、異なるプラットフォーム、OS、ミドルウェア、プログラミング言語、およびツールに跨るWeb
サービスの相互運用性を推進するために設立されたオープンな業界の団体です。この団体には、
Webサービスを推進している主要な企業が参加しており、ここで決められた事項は業界標準と言う
ことができます。
SOAPやWSDLを使用したWebサービスは相互運用性が高いと言われてきましたが、実際には製
品間での相互運用性を実現するにはWebサービス開発者による試行錯誤が必要で簡単には実現
できませんでした。例えば、Apache SOAPとMSの.NETを接続させるには、この分野に高度なスキ
ルを持つ人が作成しないと簡単にはWebサービスで接続することができませんでした。WS-Iはこう
した状況を改善するために作られた組織であり、Webサービスの現実的な相互運用性を実現する
ために様々な活動をしています。WS-Iは実際の活動をするにあたって、Webサービス関連の各種
標準を策定しているW3CやOASISと連携しながら活動しています。それ以外の団体とも協調しなが
ら業界の標準となるものを作成しています。WS-Iの活動のメインは、Profileと呼ばれる相互運用性
に関するガイドを作成することです。
WS-I Basic Profile1.1は2004年に正式公開されたプロファイルですが、現役で使用されているプロ
ファイルになります。このバージョンのプロファイルで定義されている主な内容としては、 SOAPメッ
セージを交換する際のデータの形式やSOAPボディの符号化方法となるエンコーディング方式や、
バインディングプロトコル、SOAP Fault発生時のエラーコード、リクエスト時にHTTP POSTを使用
すること、WSDLのバージョンは1.1がベースであることなどを規定しています。
プロファイルを使用することで重要なのは、実行環境とアプリケーションの双方が同じバージョンでな
ければならないということ、逆に同じバージョンのプロファイルに準拠していることで、他ベンダー上
のWebサービスとの相互運用性が確保されるということになります。
(参考)
「WS-I WEB SERVICES INTEROPERABILITY ORGANIZATION」・・・http://www.ws-i.org/
23
WAS V7でのBasic Profileのサポート
WAS
WAS V7
V7 W/S
W/S
WAS V7では、WS-I Basic Profile 1.2/2.0を追加でサポート
WS-I Basic Proifle 1.2
WS-Addressing1.0
MTOM1.0 / XOP
WS-I Basic Proifle 2.0
SOAP1.2
WS-I Reliable Secure Profile 1.0
WS-Trust 1.3
WS-ReliableMessaging 1.1
WS-SecureConversation 1.3
WS-I Basic Profile 2.0 SOAP1.2
WS-I Basic Profile 1.2
WS-Addressing
WS-I Basic Security Profile 1.0/1.1
Kerberos Token Profile
WS-Security 1.0/1.1
MTOM
X.509 Token Profile
WS-I Basic Profile 1.0/1.1
WS-I Attachment Profile
Username Token Profile
SAML Token Profile
REL Token Profile
WS-I Simple SOAP Profile
WebSphere Application Server V7
Announcement Workshop 2008
# 24
© IBM Corporation.
WAS V7では、新規にWS-I Basic Profile1.2および2.0を追加でサポートしています。
Basic Profile1.2では、WS-Addressing1.0、MTOM1.0を、 Basic Profile2.0ではSOAP1.2
をサポートします。 Basic Profile以外のプロファイルについては、後続のセッションで扱います。
24
JAX-WSとJAX-RPCアプリケーションの相互接続
大前提:WS-I Basic Profileに準拠
JAX-WS と JAX-RPC アプリケーション
WAS
WAS V7
V7 W/S
W/S
JSR109
双方向呼び出しが可能
JAX-RPCではポリシー・セットは使用できない
WAS V7InfoCenter
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/topic/com.ibm.websphere.base.doc/info/aes/ae/twbs_devwbsjaxwsclient.html
JAX-RPC 仕様に基づく Web サービス・クライアントは、 Web サービス記述言語
(WSDL) ファイルが Web Services-Interoperability (WS-I) Basic Profile に準拠し
ている場合は、JAX-WS ベースの Web サービスを呼び出すことができます。
JSR109 V1.2 Specificationより
http://jcp.org/en/jsr/detail?id=109
4.2.9 JAX-RPC and JAX-WS Interoperability
Interoperability between a JAX-RPC client and JAX-WS endpoint (or vice-versa)
is governed by the
requirements defined by the WS-I Basic Profile 1.0. As long as both the client
and the server adhere to these
requirements, they should be able to interoperate.
WebSphere Application Server V7
Announcement Workshop 2008
# 25
© IBM Corporation.
JSR109 V1.2には、JAX-RPCとJAX-WSアプリケーションの相互運用性について明記さ
れています。WS-I Basic Profileに準拠することで、JAX-RPCアプリケーション、JAX-WSアプ
リケーションの双方の呼び出しが可能になります。ただ、JAX-WSにはアタッチすることができ
るポリシー・セットは、JAX-RPCアプリケーションにはアタッチできないことに注意してください。
(ポリシー・セットについては後続のセッションで説明します)
25
(参考)Webサービス標準
WAS
WAS V7
V7 W/S
W/S
W3C
XML, XML Schema, XML Namespaces
http://w3.org
XML Encryption, XML Digital Signature
SOAP, WSDL
WS Addressing, Policy
OASIS
WS-Security, WS-Trust
WS-SecureConversation, WS-SecurityPolicy
http://oasis-open.org
BPEL
Reliable Messaging, Transactions
WS-I
Driving interoperable Web services through technical guidance
Basic Profile 1.1 & 1.2 & 2.0
Security Profile
http://ws-i.org
Conformance test tools
WebSphere Application Server V7
Announcement Workshop 2008
# 26
© IBM Corporation.
Webサービス標準を規定している団体と、その団体が規定している主な仕様になります。
26
メッセージ交換パターンとトランスポートプロトコル
WAS
WAS V7
V7 W/S
W/S
WebSphere Application Server V7
Announcement Workshop 2008
# 27
© IBM Corporation.
27
Webサービスにおけるトランスポートプロトコル
WAS
WAS V7
V7 W/S
W/S
Webサービスでは、SOAPを伝送するトランスポートは規定されていない
WAS V7では、JAX-RPC/JAX-WS共に、HTTPとJMSの選択が可能
データ・フォーマット
トランスポート
SOAP
etc...
HTTP
JMS
SOAP/HTTP
SOAP/JMS
SOAP/HTTP
同期処理
WS-Iに準拠
Webサービス
リクエスター
SOAP/HTTP
Webサービス
プロバイダー
SOAP/JMS
メッセージ基盤を使用した信頼性の高い処理を実現
キューを介すため、非同期処理
WS-Iに準拠していない
Webサービス
リクエスター
SOAP/JMS
Webサービス
プロバイダー
メッセージ転送は
MOM製品が保証
WebSphere Application Server V7
Announcement Workshop 2008
# 28
© IBM Corporation.
Webサービスでは、SOAPを伝送するトランスポートは規定されていません。WAS V7では、
JAX-RPC、JAX-WS共にトランスポートプロトコルとして、HTTPおよびJMSをサポートしてい
ます。
SOAP/HTTPとSOAP/JMSの特徴の相違を説明します。SOAP/HTTPが同期通信を行うの
に対して、SOAP/JMSはメッセージ基盤(キュー)を介した処理を行うことにより、結果的に非
同期処理となります。SOAP/HTTPは、一般にWebサービス間の通信で使用されているプロト
コルであり、WS-Iにも規定されるWebサービスの標準のプロトコルです。一方、SOAP/JMSは
WS-Iの準拠はありません。しかしWAS V6.1まではIBMの拡張機能として実装されていました
が、WAS V7よりW3Cで標準化が進められているSOAP over JMS 仕様をベースに実装され
ており、異なるプラットフォームとのインターオペラビリティーが実現できます(後述)。またJMS
を使用した場合には、Webサービス・リクエスター、またはWebサービス・プロバイダーから送
信されたメッセージはQueueまたはTopicにputされ、データベースなどの永続化ストレージに
保管されます。そして、通信に失敗した場合には、通信に成功するまで、永続化ストレージに
保管されます。また、リクエスター上にあるローカルキューにメッセージを送信した時点で、リク
エスター側の処理が一旦完了し、プロバイダーへのメッセージ転送をミドルウェアが保証してく
れるという点で、信頼性が高いという特徴があります。
28
(参考)SOAP/HTTPを使用したWebサービスアプリケーションの仕組み
WAS
WAS V7
V7 W/S
W/S
プロバイダーがJavaBeanの場合
サービス
エンドポイント
リクエスター
プロキシー
WSDL
SOAPクライアント
Webサービスエンジン
プロバイダー
(Java Bean)
Protocol(SOAP)
Transport (HTTP)
Webコンテナ
Webコンテナ
endptEnablerコマンドに
てルーター用WAR作成
プロバイダーがEJBの場合
リクエスター
スタブ
HTTPRouter
WSDL
SOAPクライアント
サービス
エンドポイント
Webサービスエンジン
Protocol(SOAP)
Webコンテナ
Transport (HTTP)
Webコンテナ
プロバイダー
EJB
(Session Bean)
EJBコンテナ
WebSphere Application Server V7
Announcement Workshop 2008
# 29
© IBM Corporation.
ここでWebサービスアプリケーションの仕組みについて確認します。まず、SOAP/HTTPアプ
リケーションになります。
WebサービスリクエスターからのリクエストはJavaプロキシー、SOAPクライアントを経由して、
HTTPクライアントからサーバーへ発行されます。Webサービスプロバイダーでは、HTTPサー
バーがリクエストを受け取った後、Webサービス・エンジンが処理を引き継ぎます。プロバイ
ダーサービスがJavaBeanとして実装されている場合は、Servletを経由して呼び出されますが、
EJB(Session Bean)として実装されている場合は、Web ルーターモジュール内のサーブレッ
ト経由で呼び出されることになります。また、このルーターモジュールは、endptEnablerコマン
ドで作成することが可能です。endptEnablerコマンドについては、後述します。
29
(参考)SOAP/JMSを使用したWebサービスアプリケーションの仕組み
WAS
WAS V7
V7 W/S
W/S
プロバイダーはEJBのみ
JMSRouterとして、MDB(Message Driven Bean)を使用
Webサービスエンジン
リクエスター
WSDL
プロキシー
プロバイダー
EJB
(Session Bean)
MDB
SOAPクライアント
Protocol(SOAP)
JMSRouter
endptEnablerコマンドに
てルーター用JAR作成
JMSSender
Webコンテナ
EJBコンテナ
Queue
WebSphere Application Server V7
Announcement Workshop 2008
# 30
© IBM Corporation.
次にSOAP/JMSのアプリケーションになります。
WebサービスリクエスターからのリクエストはJavaプロキシー、SOAPクライアントを経由して、
JMSセンダーからキューへputされます。Webサービスプロバイダーでは、ルーターモジュー
ルであるMDBがキューよりメッセージを受信して、Webサービスエンジンへ渡すことになります。
最後に、Webサービスエンジンがサービスを実装したSession Beanを呼び出します。なお、
SOAP/JMSではプロバイダーとしてEJBのみをサポートしています。
30
メッセージ交換パターン
WAS
WAS V7
V7 W/S
W/S
リクエスターは、以下の3つの方式でプロバイダーを呼び出すことが可能
同期型(JAX-RPC,JAX-WS)
サービス呼び出し後、レスポンス待ってから処理を続行
片方向型(JAX-RPC*,JAX-WS)
サービス呼び出しのレスポンスは受け取らない
非同期型双方向(JAX-WSのみ)
サービス呼び出し後、レスポンス待たずに処理を続行
非同期型双方向
片方向型
同期型
プロバイダー
リクエスター
JAX-WS
Only
リクエスト
レスポンス
プロバイダー
リクエスター
リクエスト
処理
続行
プロバイダー
リクエスター
リクエスト
処理
続行
レスポンス
*JAX-RPC1.1よりサポート
WebSphere Application Server V7
Announcement Workshop 2008
# 31
© IBM Corporation.
WebサービスリクエスターとWebサービスプロバイダーのメッセージ交換パターンは大きく3
種類に大別できます。同期型、片方向型、非同期型双方向になります。同期型と非同期型双
方向は、メッセージの送受信を行いますが、片方向型は、メッセージを送信するのみで、結果
を受け取りません。JAX-WSではすべてのパターンをサポートしていますが、JAX-RPCでは非
同期型双方向をサポートしていません。(なお、JAX-RPCの片方向型はJAX-RPC1.1よりサ
ポートされています)
同期型は、サービス呼び出し後、レスポンスを待ってから処理を続行することになるため、レ
スポンスが返ってくるまで、リクエスターのスレッドはブロックされます。片方向型は、サービス
呼び出し後のレスポンスを受け取らず、サービス呼び出し後処理を続行することができます。
非同期型双方向は、サービス呼び出し後、レスポンスを待たずに処理を続行しますが、別のス
レッドがプロバイダーからのレスポンスを処理することになります。非同期型双方向について、
もう少し詳しくみていきましょう。
31
JAX-WSによる非同期型双方向呼び出し
JAX-WS
Only
WAS
WAS V7
V7 W/S
W/S
クライアントの非同期プログラミングモデル
リクエスターの処理とは別スレッドでプロバイダーを呼び出すことが可能
JAX-WSクライアントで可能な非同期プログラミング
java.util.concurrent.Executorが別スレッドでオペレーションを実行
ポーリング:サービス呼び出し後、任意箇所でのレスポンス問い合わせ
コールバック:AsyncHandlerがレスポンスを受け取り処理
ポーリング
プロバイダ
リクエスタ
コールバック
リクエスト
リクエスト
処理
続行
プロバイダ
リクエスタ
処理
続行
レスポンス
問い合わせ
レスポンス
(別スレッドのハンドラー
が受け取り、処理)
WebSphere Application Server V7
Announcement Workshop 2008
# 32
© IBM Corporation.
非同期型双方向は、JAX-WSクライアントによる非同期プログラミングによって実現されます。
この非同期プログラミングによって、リクエスターの処理とは別スレッドでプロバイダーを呼び出
すことが可能になります。また、非同期型双方向には、ポーリングとコールバックの2種類ありま
す。ポーリングは、サービス呼び出し後、任意の箇所でレスポンスの問合せを行ってからリクエ
スターの処理が完了します。コールバックは、ハンドラーがレスポンスを受け取り処理すること
になります。ポーリング同様に、リクエスターの呼び出し元クラスで結果を取得することも可能で
す。
これらの別スレッドによる処理は、java.util.concurrent.Executerによって実行されます。
32
メッセージ交換パターンとトランスポートプロトコルの選択
WAS
WAS V7
V7 W/S
W/S
メッセージ交換パターンの選択
同期型、片方向型、非同期型双方向(JAX-WSのみ)
トランスポートプロトコルの選択
HTTP or JMS
同期型
片方向型
SOAP
Request
SOAP
Request/Reply
SOAP
プロバイダー
Application
リクエスター
Request/Reply
非同期型双方向
Tranport
JMS
HTTP
WebSphere Application Server V7
Announcement Workshop 2008
# 33
© IBM Corporation.
また、アプリケーションレイヤーにおけるメッセージ交換パターンとは別に、トランスポートレイ
ヤーでは、HTTPもしくはJMSを選択することが可能です。メッセージ交換パターンとトランス
ポートプロトコルの組み合わせについてみていきたいと思います。
33
同期型
WAS
WAS V7
V7 W/S
W/S
サービス呼び出し後、レスポンスを待ってから処理を続行
即時性が求められる処理
例外の即時検知が可能
プロバイダー
リクエスター
SOAP/HTTP
リクエスト
レスポンス
SOAP/JMS
リクエスト
レスポンス
<portType name="Test2">
<operation name="echo">
<input message="tns:echo"/>
<output message="tns:echoResponse"/>
</operation>
</portType>
WebSphere Application Server V7
Announcement Workshop 2008
# 34
© IBM Corporation.
同期型になります。このパターンを使用するユースケースとしては、下記のような場合が考え
られます。
・照会処理などリアルタイムで結果を求められるケースで使用
・即時処理が必要なケースで使用
・例外が発生した場合、クライアントにエラーが返り、例外の検知が可能
・照会処理のみであれば単純リトライ
・リソース更新を伴う場合、処理状況の確認が必要
リクエスターとプロバイダーそれぞれでリソースの更新処理が発生し、かつそれらの処理をト
ランザクション処理とする場合(1つのトランザクションスコープで囲まれるケース)、プロトコルと
してはSOAP/HTTPを使用し、WS-AtomicTransaction(WS-AT)を採用する必要があります。
WS-ATについては、『WebSphere Application Server 最新動向ワークショップ(2007年4月
版)』の「WAS V6.1におけるWebサービス分散トランザクションのサポート」を参考にしてくださ
い。
34
片方向型
WAS
WAS V7
V7 W/S
W/S
サービス呼び出しのレスポンスは受け取らない
実行結果をすぐに求められないケース(バッチなど)
エラーが返らない(業務での対応が必要になる)
通信の信頼性が求められる
プロバイダー
リクエスター
SOAP/HTTP
リクエスト
処理
続行
SOAP/JMS
リクエスト
処理
続行
<portType name="Test3">
<operation name="echo">
<input message="tns:echo"/>
</operation>
</portType>
WebSphere Application Server V7
Announcement Workshop 2008
# 35
© IBM Corporation.
片方向型になります。このパターンを使用するユースケースとしては、下記のような場合が考
えられます。
・実行結果をすぐに求められないケースで使用
・バッチなど即時処理が必要でないケース
・例外が発生してもクライアントにエラーが返らないため、成功/失敗の確認が業務で必
要
・通信の信頼性が求められる
なお、上記のような特徴からこのケースでは、プロトコルとして信頼性の高いSOAP/JMSを採
用することをお勧めします。デフォルトでは、リクエスターの更新処理とキューへのメッセージ
送信処理、キューからのメッセージ受信処理とプロバイダーの更新処理はそれぞれトランザク
ション処理として扱われませんが、片方向型の場合のみ、enableTransactionalOneWayプロ
パティを設定することにより、トランザクション処理として扱うことが可能になります。
また、JAX-WSアプリケーションでは、SOAP/HTTPを使用する場合にも、WS-RMと併用す
ることで信頼性をあげることが可能になります。WS-RMについては後続セッションで説明しま
す。
(参考)
「JAX-RPCのenableTransactionalOneWay」
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/topic/com.ibm.websphere.nd.doc/info/ae/ae/twbs_j
msonewayreq.html
「JAX-WSのenableTransactionalOneWay」
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/topic/com.ibm.websphere.nd.doc/info/ae/ae/twbs_j
mstransactreqstd.html
35
非同期型双方向
WAS
WAS V7
V7 W/S
W/S
サービス呼び出し後、レスポンスを待たずに処理を続行
実行結果は必要だが、長時間かかるので同期型は使用しない
JAX-WS
Only
クライアントは先に別の処理をしたい
プロバイダー
リクエスター
リクエスト
処理
続行
SOAP/HTTP
レスポンス
リクエスト
処理
続行
SOAP/JMS
レスポンス
WebSphere
<portType name="Test2">
<operation name="echo">
<input message="tns:echo"/>
<output message="tns:echoResponse"/>
# 36
Application Server V7 </operation>
</portType>
Announcement Workshop 2008
© IBM Corporation.
非同期型双方向になります。このパターンを使用するユースケースとしては、下記のような場
合が考えられます。
・実行結果は必要だが、長時間処理なので同期型は使えない。先に別の処理を進め
たい。
コールバック
・サービス側の処理が終了したら、サービス側からコールバックハンドラーを実行
・クライアントは先に処理を進めることができる
ポーリング
・クライアントからサービスの結果を取得する
36
片方向型と同期型voidの違い
WAS
WAS V7
V7 W/S
W/S
片方向型
リクエスターにはXMLのレスポンスメッセージは返らずHTTPステータスコー
ドのみが返る
例外メッセージが戻る可能性もない。
同期型&レスポンスがVoid
空のsoap:bodyを含むレスポンスが返る。
例外が戻ってくる可能性がある。
@WebService
<portType name="Test2">
public class Test3 {
<operation name="echo">
public void echo(String input) {
<input message="tns:echo"/>
}
<output message="tns:echoResponse"/> }
</operation>
</portType>
void型
プロバイダー
リクエスター
リクエスト
処理は
ブロック
空のレスポンス
or例外
片方向型
<portType name="Test3">
<operation name="echo">
<input message="tns:echo"/>
</operation>
</portType>
@WebService
public class Test3 {
@Oneway
public void echo(String input) {
}
}
プロバイダー
リクエスター
リクエスト
処理
続行
WebSphere Application Server V7
Announcement Workshop 2008
# 37
© IBM Corporation.
片方向型では、WSDLのOperationにoutput messageを定義しません。これは、WSDL1.1
の仕様で決められています。片方向型の場合には、リクエスターにはXMLのレスポンスメッ
セージは返らず、HTTPステータスコードのみが返ります。なお、例外メッセージが返ることもあ
りません。またリクエスターは、サービスを呼び出した直後に処理を続行することが可能です。
同期型のWSDLを使用(output messageの定義あり)し、void型を使用している場合には、
空のsoap:bodyを含むレスポンスが返ります。また例外が戻る可能もあります。またリクエス
ターは、サービスのレスポンスが返ってくるまで処理がブロックされることに注意してください。
JAX-RPCアプリケーションでボトムアップ開発をする場合、Webサービスウィザードで「ボイド
を戻す」の設定を“片方向”にすることで片方向型のWSDLが生成されます。
JAX-WSアプリケーションでボトムアップ開発をする場合、@Onewayアノテーションを使用し
て明示的に片方向であることを宣言している場合には、片方向型のWSDLが生成されます。
片方向型のプログラミングモデルの詳細については、『WAS V6.1 SOA Webサービス・ワー
クショップ』の「JAX-WSによるメッセージ指向プログラミング」を参照してください。
37
JAX-WSのプログラミングモデル
WebSphere Application Server V7
Announcement Workshop 2008
WAS
WAS V7
V7 W/S
W/S
# 38
© IBM Corporation.
38
JAX-WSプログラミングの特徴-アノテーションによるEoD
WAS V7 W/S
WAS V7 W/S
アノテーションによってコードがシンプルに
アノテーションによって、デプロイメント・ディスクリプターは不要に
JAX-RPC 1.1 Webサービスプロバイダー例
public interface HelloService extends Remote {
public String sayHello(String name) throws RemoteException;
}
public class HelloServiceBean implements SessionBean {
public String sayHello(String name) {
return "Hello "+ name + " from HelloServiceBean";
}
}
マッピング
DD
ファイル
JAX-WS 2.1 Webサービスプロバイダー例
@WebService
public class HelloServiceBean {
public String sayHello(String name) {
return "Hello "+ name + " from HelloServiceBean";
}
}
JAX-RPC 1.1 Webサービス・リクエスター例
try {
Context ic = new InitialContext();
//JNDIルックアップ
MyHelloService myHelloService = (MyHelloService)
ic.lookup("java:comp/env/service/MyJAXRPCHello");
HelloIF helloPort = myHelloService.getHelloIFPort();
// ... サービス呼び出し ...
helloPort.sayHello();
} catch (NamingException ex) {
// ...
マッピング
} catch (RemoteException ex) {
DD
ファイル
:
JAX-WS 2.1 Webサービス・リクエスター例
public class MyComponent {
@WebServiceRef(MyHelloService.class)
HelloIF helloPort;
public void myMethod() {
// 直接ポートからサービス呼び出し
helloPort.sayHello();
}
WebSphere Application Server V7
Announcement Workshop 2008
# 39
© IBM Corporation.
JAX-WSアプリケーションは、アノテーションを使用することによって、コードをシンプルにし
てます。 JAX-WS は Java プログラミング言語 (JSR 175) 仕様のメタデータ機能、Java
Platform (JSR 181) 仕様の Web サービス・メタデータ、および JAX-WS 2.0 (JSR 224) 仕
様によって定義されたアノテーション (Java Architecture for XML Binding (JAXB) アノテー
ションを含みます) に基づいてアノテーションをサポートします。
WebServices Meta Deta(JSR181)では、JAX-WSプログラミングモデルで利用される基本
的なアノテーション規定しています。
@WebService, @WebMethod, @OneWay, @WebParam, @WebResult
@SOAPBinding, @HandlerChain (全てjavax.jwsパッケージ)
以下のアノテーションに関してはJAX-WS(JSR224)内で規定しています。
@WebServiceProvider, @WebServiceClient, @WebFault, @WebEndpoint
@ServiceMode, @RequestWrapper, @ResponseWrapper, @BindingType
@WebServiceRef (全てjava.xmlパッケージ)
また、JAX-WSアプリケーションでは、マッピング情報などはこのアノテーションで設定するた
め、JAX-RPCでは必要だったデプロメイント・ディスクリプターやマッピングファイルが必須で
はなくなりました。
39
JAX-WS 2.1のプログラミングモデル-全体像
リクエスター
プロバイダー
SEI ベースエンドポイント
動的プロキシーによる呼び出し
Service
Service
@WebService
Client
クライアントコード
クライアントコード
SEI
SEI
@BindingType
動的
動的
Proxy
Proxy
クライアントコード
クライアントコード
ServiceImpl
ServiceImpl
Bean
Bean
SEI
SEI
SOAP/HTTP
JAXB
JAXB
JAXB
JAXB
クラス
クラス
クラス
クラス
JAXB
JAXB
JAXB
JAXB
クラス等
クラス等
クラス
クラス
WAS
WAS V7
V7 W/S
W/S
@WebService
JAXB
JAXB
JAXB
JAXB
クラス
クラス
クラス
クラス
ServiceImpl
ServiceImpl
Bean
Bean
Dispatch
Dispatch
XML/HTTP
DispatchAPIによる呼び出し
@WebService
Provider
JAXB
JAXB
JAXB
JAXB
クラス等
クラス等
クラス
クラス
Provider ベースエンドポイント
Javaのオブジェクトとし
て扱いたいか、XMLそ
のものを扱いたいか
WebSphere Application Server V7
Announcement Workshop 2008
# 40
© IBM Corporation.
JAX-WSのプログラミングモデルでは、リクエスター、プロバイダーそれぞれ2パターンありま
す。リクエスターには動的プロキシーによる呼び出しとDispatchAPIによる呼び出しがあり、プ
ロバイダーには、SEIベースエンドポイントとProviderベースエンドポイントがあります。それぞ
れを組み合わせて使用することも可能ですが、基本的にXMLドキュメントをJavaのオブジェクト
として扱いたい場合には、動的プロキシーによる呼び出し×SEIベースエンドポイントでよく、
ツールによる自動生成クラスを利用できるという点で開発生産性が高いといえます。逆にXML
そのものを扱いたい場合には、 DipatchAPIによる呼び出し×Providerベースエンドポイントを
使用することになりますが、自動生成クラスは使用しないため開発の難易度も上がります。バイ
ンディングタイプとしてXML/HTTPバインディングを使用する場合には、DipatchAPIによる呼
び出し×Providerベースエンドポイントを使用する必要があります。
40
Provider
プロバイダーのプログラミング・モデル
WAS
WAS V7
V7 W/S
W/S
2種類のエンドポイントをサポート
SEI ベースエンドポイント
SEI(サービス・エンドポイント・インタフェース)経由で、サービス実装にアクセス
@WebServiceアノテーションによる宣言
OutBean hello(InBean inbean);
SEI
SEI
SOAP
ServiceImpl
ServiceImpl
Bean
Bean
@WebService
JAXB
JAXB
JAXB
JAXB
クラス
クラス
クラス
クラス
Provider ベースエンドポイント
JAX-WS 2.0 から新規追加されたXMLメッセージレベルの操作が可能なサービス
XMLもしくはSOAPメッセージを受け付けることが出来る
JAXB
@WebServiceProviderアノテーションによる宣言
JAXB
JAXB
JAXB
クラス等
クラス等
クラス
XML処理は開発者側の責任でコーディングが必要
クラス
ServiceImpl
ServiceImpl
メッセージ構造の検証は開発者コード側の責任
ツールによる自動生成は必要なし
SOAP
/XML
Bean
Bean
@WebService
Provider
T invoke(T message);
WebSphere Application Server V7
Announcement Workshop 2008
# 41
© IBM Corporation.
プロバイダーのプログラミングモデルには、2種類あります。
SEIベースエンドポイントは、JAX-RPCのSEI実装に似ています。ただし、JAX-RPC とは異
なり、 SEI はオプションになります。ボトムアップ開発の場合、関連付けられた SEI を持たない
JAX-WSサービスは、暗黙的な SEI を持っていると見なされます。それに対して、関連付けら
れた SEI を持つサービスは、明示的な SEI を持っていると見なされます。なお、トップダウン
開発の場合には、SEIは自動作成されます。 SEIベースエンドポイントは、@WebServiceアノ
テーションによって、宣言する必要があります。
Providerベースエンドポイントは、JAX-WSで新規に導入されたAPIです。SOAPはもちろん、
XMLメッセージレベルの操作が可能な点が大きな特徴です。 Providerベースエンドポイントは、
@WebserviceProviderアノテーションによって、宣言する必要があります。また、開発ツール
による自動生成を使用せず、XMLのメッセージ検証は、開発者の責任によって行う必要があり
ます。
@WebServiceアノテーションと@WebServiceProviderアノテーションは同時に利用するこ
とができません。
プログラミングモデルの詳細については、『WAS V6.1 SOA Webサービス・ワークショップ』
の「JAX-WSによるメッセージ指向プログラミング」を参照してください。
41
プロバイダー実装としてEJB3.0をサポート
Provider
New
v7
WAS
WAS V7
V7 W/S
W/S
WAS V7より、EJB3.0のWebサービス実装をサポート
EJB3.0のWebサービス化における条件
Stateless Session Beanであること
EJB3.0(もしくはそれ以上)のモジュールにパッケージすること
endptEnabler コマンドでルーター・モジュールを作成済みであること
SOAP/HTTP 及び SOAP/JMS のいずれのトランスポートも使用可能
RAD V7.5を使用して開発する場合
Webサービスウィザードでは以下の開発方法をサポート
JAX-RPC & EJB3.0
ボトムアップおよびトップダウン開発
JAX-WS & EJB3.0
Stateless
トップダウン開発
SOAP/HTTP
SOAP/JMS
Router
EJB3.0
WebSphere Application Server V7
Announcement Workshop 2008
# 42
© IBM Corporation.
WAS V7より、プロバイダーの実装としてEJB3.0をサポートしました。JSR109 V1.2により規
定されています。EJB3.0のWebサービス化における条件としては、以下の3つになります。
・Stateless Session Beanであること
・EJB3.0のモジュールにパッケージすること
・ルーターモジュールが作成されていること
ルーターモジュールが必要な理由は、SOAP/HTTPアプリケーションの仕組み、SOAP/JMS
アプリケーションの仕組みで紹介したように、それぞれルーターモジュール経由でサービス実
装にアクセスする必要があるからです。endptEnablerコマンドについては、次ページ以降で説
明します。
トランスポートプロトコルとしては、SOAP/HTTP,SOAP/JMS共にサポートします。
開発ツールとしてRAD V7.5を使用している場合、JAX-WSでは、EJB3.0のボトムアップ開
発をサポートしていない点にご注意ください。
42
Provider
endptEnablerコマンドについて
WAS
WAS V7
V7 W/S
W/S
EARファイル内の一連のWebサービスで使用可能
Webサービスに対応するEJBモジュールを含むEARファイル上で実行
endptEnablerコマンドによって作成される各ルーター・モジュールが、特定のトランス
ポート用のWebサービス・エンドポイントを提供
HTTP:HTTPルーター・モジュールを追加して、WebサービスがHTTPトランスポート経由で要
求を受信することが可能
JMS:JMSルーター・モジュールを追加して、Webサービスがキューやトピックから要求を受信
することが可能
宛先の種類やアクティベーションスペックのJNDI名(もしくはリスナー・ポート)などを指
定
HTTPRouter
サービス
エンドポイント
プロバイダー
(EJB)
JMSRouter
サービス
エンドポイント
EJB
ビジネス・ロジック
WebSphere Application Server V7
Announcement Workshop 2008
# 43
© IBM Corporation.
enptEnablerコマンドは、EARファイル内の一連のWebサービスモジュールで使用できるコ
マンドになります。また、ルーター・モジュールが必要になるEJBモジュールで使用することに
なります。
enptEnablerコマンドによって作成されるルーター・モジュールは、トランスポートによって異
なります。
HTTPの場合には、HTTPルーター・モジュールを作成し、WebサービスがHTTPトランス
ポート経由で要求を受信することが可能になります。
JMSの場合には、JMSルーター・モジュールを作成し、Webサービスが指定されたキューも
しくはトピックから要求を受信することが可能になります。そのため、JMSルーター・モジュール
作成時には、宛先の種類(キュー or トピック)やルーターモジュールであるMDBの起動に
必要なアクティベーション・スペックの定義が必要になります。
43
endptEnablerコマンドの使用
Provider
WAS
WAS V7
V7 W/S
W/S
RADV7.5のWebサービスウィザードを使用して開発する場合、バックグ
ラウンドで実行されるため特に意識する必要はない
ただし、EJB3.0のJAX-WSサービスのボトムアップ開発用のWebサービス
ウィザードは用意されていない
以下の手順で作成が可能
@WebService or @WebServiceProviderおよび@Statelessアノテーションを使用したコードを作成
endptEnablerコマンドを明示的に発行
endptEnaberコマンドを明示的に発行する方法
WASの“InstallDir”/binディレクトリ
RADのエンタープライズ・エクスプローラー/サービスビューから、サービス名
を右クリック⇒生成⇒ルーター・モジュール(endptEnabler)の作成
WebSphere Application Server V7
Announcement Workshop 2008
# 44
© IBM Corporation.
endptEnablerコマンドの使用についてですが、RAD V7.5のWebサービスウィザードを使用
して開発する場合には、ウィザード実行中にバックグラウンドで実行されるため意識する必要
はありません。実際の画面については、次ページに添付しています。
ただし、JAX-WSサービスにおけるEJB3.0のボトムアップ開発においては、Webサービス
ウィザードが用意されていません。その場合には、Webサービス実装のアノテーション
(@WebService or @WebServiceProvider)およびStateless Session Beanのためのアノ
テーション(@Stateless)を使用したコードを用意し、endptEnablerコマンドを明示的に発行
することになります。
enptEnablerコマンドは、WAS、RADそれぞれで用意されています。
44
(参考)RADウィザードでのルーターモジュール作成
Provider
WAS
WAS V7
V7 W/S
W/S
Webサービスウィザードを使用する場合、
endptEnablerコマンドをバックグラウンドで
発行されているため、意識して発行する必要
はない
JAX-WSのボトムアップ開発では不可
※ウィザードの最終画面
サービスビュー/エンタープライズビューか
らサービス名を右クリック→「ルーター・
モジュール(endptEnabler)の作成」を明
示的に発行
WebSphere Application Server V7
Announcement Workshop 2008
# 45
© IBM Corporation.
RAD V7.5を使用した場合の、Webサービスウィザードを使用してendptEnablerコマンドが
バックグランウンドで実行される箇所、明示的に発行した場合のそれぞれの画面になります。
45
Requester
リクエスターのプログラミング・モデル
WAS
WAS V7
V7 W/S
W/S
2種類のサービス呼び出し方法をサポート
動的プロキシー経由の呼び出し
JAX-RPC 1.1と同様に、プロキシー経由でサービスにアクセスする呼び出し方法
JAX-RPCの静的スタブとは異なり、事前生成ではなく、実行時ServiceからgetPortした際に動的生
成(ポータビリティの向上)
Service
Service
getPort
クライアントコード
クライアントコード
JAXB
JAXB
JAXB
JAXB
クラス
クラス
クラス
クラス
動的
動的
Proxy
Proxy
SEI
SEI
SOAP
outBean hello(InBean inbean);
Dispatch経由の呼び出し
JAX-WS 2.0 から新規追加されたXMLメッセージレベルの操作が可能なリクエスター
XML/HTTPリクエストを送信することが出来る
自動生成コードは使用せず、実装コードで適切なXMLメッセージを構築
XMLメッセージ構造を正確に把握している必要がある
SOAP
XML
JAXB
JAXB
JAXB
JAXB
クラス等
クラス等
クラス
クラス
クライアントコード
クライアントコード
Dispatch
Dispatch
SOAP
XML
T invoke(T message);
WebSphere Application Server V7
Announcement Workshop 2008
# 46
© IBM Corporation.
JAX-WSクライアントのプログラミングモデルは、Dispatchクライアント API と、動的プロキ
シークライアント API の両方をサポートします。 Dispatchクライアントが、Serviceを動的に生
成するのに対して、動的プロキシークライアントは、事前生成された静的Serviceを使用します。
Dispatchクライアントおよび動的プロキシークライアントは、共に 同期型呼び出し、片方向型
呼び出しと非同期型双方向呼び出しが可能です。
動的プロキシークライアントは、提供されるSEIに基づく Web サービスを呼び出します。
JAX-RPC1.1と同様にプロキシー経由で呼び出しますが、JAX-RPCの静的スタブとは異なり、
実行時にServiceからgetPort()してプロキシーを取得することになります。
Dispatch クライアントの開発は、Probiderベースエンドポイントの開発同様、ツールによる自
動生成は使用しません。そのため、実装のためにはXML 構成体に詳しい必要があり、上級
XML 開発者向けになります。 メッセージ交換パターンに応じて、それぞれ必要なInvokeメソッ
ドを使用します。
同期型:Object invoke(T);
片方向型:void invokeOneway(T);
ポーリング:Response<T> invokeAsync(T);
コールバック:Future<?> invokeAsync(T, AsyncHandler);
プログラミングモデルの詳細については、『WAS V6.1 SOA Webサービス・ワークショップ』
の「JAX-WSによるメッセージ指向プログラミング」を参照してください。
46
動的プロキシーを利用したリクエスターのコード
Requester
WAS
WAS V7
V7 W/S
W/S
@WebserviceRefによるResource Injection(リソース注入)が可能
New
v7
JAX-RPCのようにJNDIルックアップは必要ない/WebサービスDD不要
Servletなどリソース注入をサポートしているコンポーネントクラスで実装
管理クライアントのみで使用可能
@WebServiceRef(HelloJAXWS_Service.class)
HelloJAXWS port;
ポートを取得するためのサービス
クラスを指定
protected void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
HelloJASWSポートのプロキ
シーを直接クライアントのクラ
try
スにインジェクション
//サービスの実行
message = port.invoke(input);
}catch(Exception e){
//例外処理
}
直接Portから
サービス呼び出し
WebSphere Application Server V7
Announcement Workshop 2008
# 47
© IBM Corporation.
JSR109 V1.2の規定により、JAX-WSクライアントサイドにおいて、Webサービス参照のた
めの@WebServiceRefアノテーションが使用可能になりました。@WebServiceRefの属性に
そのポートを取得するためのサービスクラス(この場合、HelloJAXWSServiceクラス) を指定
することで、HelloJAXWSポートのプロキシーを直接クライアントのクラスにインジェクションする
ことができます。そして、ポートから直接サービス呼び出しすることが可能です。
また、変数Serviceに対してHelloJASWSServiceをインジェクションし、
HelloJAXWSServiceクラスに用意されているHelloJAXWSポートのプロキシーを取得するた
めのgetHelloJAXWSSOAP()メソッドを利用して、HelloJAXWSポートのプロキシーを取得す
ることも可能です。その場合のコードは下記になります。
@WebServiceRef
HelloJAXWS_Service service;
public static void main(String args[]) {
HelloJAXWS port = service.getHelloJAXWSSOAP();
message = port.invoke(input);
}
@WebServiceRefを使用する上での注意点は、Java EE5の仕様で規定されたEJBや
Servletといった特定のクラスのみで使用することが可能な点になります。詳しくは、Java EE5
の仕様を参照してください。
また、@WebServiceRefアノテーションを使用したコードは、管理クライアントのみで使用で
きます。管理クライアントについては後述します。
47
(参考)動的プロキシーを利用したリクエスターのコード
Requester
WAS
WAS V7
V7 W/S
W/S
wsimportで生成されたServiceを使用して動的プロキシーを取得
事前生成された静的Serviceを使用
JAX-RPCのようにJNDIルックアップは必要ない/WebサービスDD不要
//静的サービスインスタンスの生成
HelloJAXWS_Service service = new HelloJAXWS_Service();
//動的プロキシーの取得
HelloJAXWS proxy = service.getHelloJAXWSSOAP();
//サービスの実行
try{
message = proxy.invoke(input);
}catch(UserException me){
//例外処理
}
静的Serviceのnew
静的Serviceのget[ポート名]メソッドで
SEIを実装したプロキシーを取得
サービス呼出し(同期型)
WebSphere Application Server V7
Announcement Workshop 2008
# 48
© IBM Corporation.
こちらのJAX-WSクライアントのコードは、リソース注入を使用しないコードになります。WAS
V6.1FPWS、WAS V7共に使用することができます。
静的ServiceであるHelloJAXWSServiceクラスには、HelloJAXWSポートのプロキシーを取
得するためのgetHelloJAXWSSOAP()メソッドが用意されているため、これを利用して
HelloJAXWSポートのプロキシーを取得します。プロキシーが取得できたら、後は目的のサー
ビスメソッド(ここではinvoke(userinfo)メソッド)を呼び出します。
なお、JAX-WSクライアントでも、JAX-RPCと同様にJNDIルックアップによるサービス参照を
することも可能です。
48
Requester
(参考)管理クライアントと非管理クライアント
WAS
WAS V7
V7 W/S
W/S
管理クライアント
JSR 109 により定義されるJava EE 用 Web サービスのクライアント
Java EE コンテナー内で稼働する必要がある
エンタープライズ・アーカイブ (EAR) ファイルとしてパッケージ
JSR 109 API とデプロイメント情報を使用して Web サービスを検索、呼び出し
非管理クライアント
Java EE コンテナー内で稼働せず、JAX-WS ランタイムを使用して Web サービスを呼び出す J2SE ク
ライアント
WSDL ファイルを直接検査し、JAX-WS API を直接使用して Web サービスの呼び出しを作成すること
が可能
デプロイメント情報を含まない JAR ファイルとしてパッケージ
JSR109に従います。で
もコンテナーが必要です
Java EEコンテナー
なしで動けます
管理クライアント
非管理クライアント
WebSphere Application Server V7
Announcement Workshop 2008
# 49
© IBM Corporation.
Java EE 用 Web サービスのクライアントはJSR109 により定義され、管理対象クライアント
と呼ばれます。このクライアントはJava EE コンテナー内で稼働する必要があります。このクラ
イアントは、エンタープライズ・アーカイブ (EAR) ファイルとしてパッケージされる必要がありま
す。Web サービスの管理対象クライアントでは JSR 109 API とJSR109で規定されたデプロ
イメント情報を使用して Web サービスを検索し、呼び出すことになります。
Java EE コンテナー内で稼働せずに、JAX-WS ランタイムを使用して Web サービスを呼び
出す J2SE クライアントは、管理対象外クライアントと呼ばれます。 Web サービスの管理対象
外クライアントは、WSDL ファイルを直接検査し、JAX-WS API を直接使用して Web サービ
スの呼び出しを作成することができ、独立型の Java クライアントになります。このクライアントは、
デプロメイント情報は必要なく、JAR ファイルとしてパッケージされます。
49
クライアントDDによるアノテーション定義のオーバーライド
Requester
WAS
WAS V7
V7 W/S
W/S
JAX-WSでは、WSDLファイルのロケーションやサービス参照は基本
的にアノテーションで定義
WebサービスDDの作成はオプション
クライアントのWebサービスDDで、サービス参照の設定が可能
@WebServiceRefアノテーションの定義を上書きすることが可能
New
v7
WebサービスDDを使用している場合は、Java EE環境にデプロイの必要あり
WebSphere Application Server V7
Announcement Workshop 2008
# 50
© IBM Corporation.
JSR109 V1.2の規定により、クライアントのデプロメイント・ディスクリプターにより、サービス参
照の定義をすることが可能になりました。さらに、@WebserviceRefや@Resourceといったア
ノテーションで定義された内容を上書きすることが可能です。
デプロメイント・ディスクリプターを使用している場合には、Java EEコンテナー上で稼動させ
る必要があります。
50
非同期型双方向プログラミングモデル
Requester
WAS
WAS V7
V7 W/S
W/S
リクエスター側での呼び出し方に依存
動的プロキシー
クライアント開発時に非同期オプションを選択することで、SEIにオペレーションごとに
ポーリングとコールバック用の2タイプの非同期メソッドが追加される
Dispatch
非同期用のinvokeAsyncメソッドを使用
ポーリング:Response<T> invokeAsync(T);
コールバック:Future<?> invokeAsync(T, AsyncHandler);
非同期メソッドのタイプ
ポーリング
メソッドコール時には処理結果を待たないが、後の任意の箇所で取得する方法
Response.isDone()でレスポンス取得状況を確認し、レスポンスが返っていればget()メ
ソッドで取得
コールバック
イベントドリブンで呼ばれるAsyncHandlerクラスのhandleResponseメソッド内にレスポ
ンス処理ロジックを記述
ポーリングモデル同様にサービス呼出し元クラスで結果を取得することも可能
WebSphere Application Server V7
Announcement Workshop 2008
# 51
© IBM Corporation.
非同期型双方向プログラミングは、リクエスターの呼び出し方に依存します。
動的プロキシーを利用する場合には、クライアント開発時に、Webサービスウィザードで「生
成されたクライアントの非同期呼び出しを使用可能にする」にチェックをいれることで、SEIにオ
ペレーションごとのポーリングとコールバック用のメソッドが追加されます。
Dispatchクライアント使用する場合には、非同期用のinvokeAsyncメソッドを使用します。
ポーリングは、メソッドコール時には処理結果を待ちませんが、後で任意の箇所で取得するこ
とになります。Response.isDone()でレスポンス取得状況を確認し、レスポンスが返っている場
合には、Response.get()メソッドで結果を取得することになります。ポーリングの場合の返り値
はResponse<T>になります。
コールバックは、レスポンスが返るとイベントドリブンで呼ばれるAsyncHandlerクラスの
handleReponseメソッド内に、レスポンス結果の処理ロジックを記述することになります。コー
ルバックはの返り値はFuture<?>になります。
なお、ポーリング同様にサービス呼び出し元クラスで結果を取得する場合には、
Future.isDone()でレスポンス取得状況を確認し、Response.get()メソッドで結果を取得します。
プログラミングモデルの詳細については、『WAS V6.1 SOA Webサービス・ワークショップ』
の「JAX-WSによるメッセージ指向プログラミング」を参照してください。
51
Standard SOAP/JMSのサポート
WebSphere Application Server V7
Announcement Workshop 2008
WAS
WAS V7
V7 W/S
W/S
# 52
© IBM Corporation.
52
New
v7
Standard SOAP/JMSのサポート
WAS
WAS V7
V7 W/S
W/S
WAS V6.1まではIBM拡張の実装で提供
異なるベンダーとの通信は保証されない
IBM proprietary SOAP/JMS
IBM
only
Service
Client
IBM
only
WAS V7より Worldwide Web Consortium (W3C) のSOAP/JMS 仕様が
(相互運用性のためのガイドラインを提供)ベース
SOAP over Java Message Service 1.0(SOAP/JMS)勧告に向けて標準化が進め
られている
http://www.w3.org/Submission/SOAPJMS/
WebSphere以外のJava EE 実行環境とSOAP/JMS通信が可能に!
standard SOAP/JMS
Any
Web service
environment
IBM
Client
Service
WebSphere Application Server V7
Announcement Workshop 2008
# 53
© IBM Corporation.
WAS V6.1まで、SOAP/JMSはIBM拡張で実装されており、異なるベンダーとの通信は保証
されていませんでした。WAS V7より、W3標準のSOAP/JMSをベースに実装されています。こ
れにより、WebSphere以外(異なるベンダー)のJava EE実行環境で、SOAP/JMSを使用した
通信が可能になります。繰り返しになりますが、SOAP/JMSはWS-Iには準拠していないため、
すべてのWebサービス環境で相互運用性が保証されているわけではありません。(例 .NET
など)
(参考)
http://www.w3.org/Submission/SOAPJMS/
SOAP-JMS Binding Working GroupによるSOAP/JMS1.0勧告に向けてのスケジュール
・June 2008: First public draft
・September 2008: Last Call draft
・December 2008: Candidate Recommendation draft
・March 2009: Proposed Recommendation draft
・April 2009: W3C Recommendation
53
Standard SOAP/JMSの使用
WAS
WAS V7
V7 W/S
W/S
Standard SOAP/JMS
JAX-RPCおよびJAX-WSのどちらもサポート
クライアントとWebサービスは、JMSキューもしくはJMSトピックを利用して通信
EJBコンテナー
Webサービス
リクエスター
Router
MDB
Queue
SOAP/JMS
Queue
Web
サービス
プロバイダー
(Stateless
Session
Bean)
SOAP/JMSにおけるベスト・プラクティス
WAS V7より、IBM拡張のSOAP/JMSは非推奨
Standard SOAP/JMSを使用することが推奨
WAS V6.1以前の製品上のクライアントアプリケーションから呼び出す必要がある場合、
IBM拡張のSOAP/JMSを使用
WebSphere Application Server V7
Announcement Workshop 2008
# 54
© IBM Corporation.
Standard SOAP/JMSを使用することで、クライアントとサーバーが異なるベンダーで構成さ
れる混合環境においても、JMSトランスポートを使用したSOAPメッセージのやりとりの相互運
用性を保証してします。また、JAX-RPCおよびJAX-WS共にサポートされます。
選択方針になりますが、基本的にはStandard SOAP/JMSを使用するようにしてください。
IBM拡張の実装については、WAS V7以降非推奨になります。ただし、WAS V6.1以前の製
品上のクライアントから呼び出す必要がある場合には、IBM拡張のSOAP/JMSを使用するよう
にしてください。
54
(参考)JAX-WSによる非同期型双方向×SOAP/JMS
WAS
WAS V7
V7 W/S
W/S
非同期型双方向とSOAP/JMS
JAX-WSクライアントは、非同期プログラミング(コールバック or ポーリン
グ)
要求メッセージは、ルーターモジュール(MDB)経由でプロバイダー処理
応答メッセージは、JMS非同期応答メッセージリスナー経由で処理
SOAP/JMS
コールバック
リクエスト
処理
続行
Request Destination
JMSによるメッセージ送信
リクエスト
JMSによるメッセージ受信
Reply Destination
レスポンス
JMS
Listener
Service
Messaging Provider
Client
JMSによるメッセージ受信
レスポンス
ルーター
モジュール
(MDB)
JMSによるメッセージ送信
(メッセージ受信後、別スレッドの
ハンドラーが受け取り、処理)
■デフォルトでは、Replyキューとして一時キューを使用
WebSphere Application Server V7
Announcement Workshop 2008
# 55
© IBM Corporation.
非同期型双方向とSOAP/JMSプロトコルを組み合わせた場合のアーキテクチャになります。
非同期型双方向では、コールバックとポーリングを使用することができます。
要求メッセージは、Requestキューを介し、ルーターモジュール(MDB)経由でStateless
Session Beanで実装されたプロバイダー処理を行います。
応答メッセージは、Replyキューを介してJMS非同期応答リスナー経由で、リクエスターに戻
ります。コールバックの場合には、メッセージ受信後にハンドラーが起動することになります。
なおReplyキューは、デフォルトでは一時キューが使用されることになります。
55
Standard SOAP/JMS のエンドポイントURLの指定
WAS
WAS V7
V7 W/S
W/S
WSDLの<port>タブで指定
SOAP/JMSでは、WSDLファイルが必須
WSDLファイルの作成がオプションであるJAX-WSアプリケーションでも必要
☺WSDLファイルの抜粋
<wsdl:service name="HelloBeanService">
<wsdl:port binding="impl:HelloBeanJMSSoapBinding" name="HelloBeanJMS">
<wsdlsoap:address location="jms:jndi:jms/soapjmsQueue?jndiConnectionFactory
Name=jms/soapjmsQCF&amp;targetService=HelloBeanJMS"/>
</wsdl:port>
</wsdl:service>
„locationは、”jms”接頭辞で始まる
※WSDLを公開する際、“HelloBeanJMS”PortがJMSPortであることを識別
„「jndi:」に、JMSキューのJNDI名がつづく
„「jndiConnectionFactory」にName=でキュー接続ファクトリーのJNDI名がつづく
WebSphere Application Server V7
Announcement Workshop 2008
# 56
© IBM Corporation.
Standard SOAP/JMSのエンドポイントURLの指定方法になります。アドレスは、WSDLの
<port>タブで定義されます。ボトムアップ開発時には、Webサービスウィザードに沿って宛先
のJNDI名やキュー接続ファクトリー名を入力すると、標準の規定に則って出力されます。
また、SOAP/JMSではWSDLファイルが必須になります。JAX-WSアプリケーションでは
WSDLの作成がオプションとなっていますが、SOAP/JMSの場合には必ず用意する必要があ
ります。
locationが、”jms”という接頭辞ではじまりますが、これによりWSDLを公開する際、このポート
がJMSポートであることを識別します。”jndi:”に続き、JMSキューのJNDI、
“jndiConnectionFactory”に、キュー接続ファクトリーのJNDI名が続きます。最後にプロバイ
ダーのサービス名が入ります。これらは必須の項目になります。
参考までに、IBM拡張のSOAP/JMSバインディングのWSDLの抜粋を添付します。
<wsdl:service name=“HelloBeanService">
<wsdl:port binding="impl:HelloBeanJMSSoapBinding" name=“HelloBeanJMS">
<wsdlsoap:address
location="jms:/queue?destination=jms/soapjmsQueue&amp;connectionFactory=jms/so
apjmsQCF&amp;targetService=HelloBeanJMS"/>
</wsdl:port>
</wsdl:service>
56
Standard SOAP/JMS のエンドポイントURL
WAS
WAS V7
V7 W/S
W/S
Standard SOAP/JMSエンドポイントURLの構文
jms:jndi:<desination-jndi-name?><property>=<value>&<property>=・・・
jms:トランスポートタイプ
jndi:宛先キューもしくはトピックのJNDI名の明記
URL定義をサポートするためのプロパティ
☺宛先に関するプロパティ(必須)
Property name
Description
jndiConnectionFactoryName
メッセージングエンジンへの接続を確立するために使用されるコ
ネクションファクトリーのJNDI名
targetService
リクエストがディスパッチされるポート名の特定
☺JNDIに関するプロパティ(オプション)
☺JMSに関するプロパティ(オプション)
jndiInitialContextFactory
priority
jndiURL
deliveryMode
replyToName
timeToLive
WebSphere Application Server V7
Announcement Workshop 2008
# 57
© IBM Corporation.
Standard SOAP/JMSエンドポイントURLの構文になります。ボトムアップ開発時に生成され
たWSDLに情報を付加する際、トップダウン開発時にはこの構文に則って記述する必要があり
ます。
57
MTOM(Message Transmission Optimization Mechanism)
WAS
WAS V7
V7 W/S
W/S
WebSphere Application Server V7
Announcement Workshop 2008
# 58
© IBM Corporation.
58
MTOMによるバイナリーデータ転送
WAS
WAS V7
V7 W/S
W/S
MTOM (Message Transmission Optimization Mechanism)
2005年1月26日にW3C勧告として公開
WS-I Basic Profile 1.2に組み込まれる
SOAP1.1/SOAP1.2いずれのバインディングも規定
SOAPメッセージにバイナリーデータの添付を行うテクノロジー
XOPを利用したバイナリーデータの送受信を可能とする
SwA (SOAP with Attachments)と異なり.NETとの互換性あり
WS-Securityと併用可能(XMLInfosetに対応)
デフォルトで、HTTP Chunkingを採用
イメージデータ
イメージデータ
プロバイダー
リクエスター
MTOM
SwA
SOAPMessage
Base64
DIME
WebSphere Application Server V7
Announcement Workshop 2008
# 59
© IBM Corporation.
分散コンピューティング環境では、バイナリーデータを使用したやりとりも頻繁に行われること
が想定されます。バイナリーデータを扱う技術としては、歴史的に多くの技術がありました。ま
ず代表的なものにBase64がありますが、Base64Encodeを使用して文字列として送るため、
SOAPのメッセージサイズが大きくなってしまうという問題がありました。そこで、SOAPにデータ
を添付するという解決を行ったDIMEやSwAというテクノロジーが登場しました。しかし、SwAは、
添付データにWS-Securityが使用できない、.NETとの互換性がないといった問題点がありま
した。またDIMEは、W3Cでの有効期限が切れており、実質採用できない技術となっています。
MTOMはこれらの問題をすべて解決してます。またMTOMの特徴として、XML-binary
Optimized Packaging (XOP) を使用することによるバイナリー・メッセージ送信の最適化を提
供し、XMLInfosetの概念を取り入れています。
またWAS V7より、デフォルトでHTTP Chunkingを採用しています。
59
MTOMの使用方法
WAS
WAS V7
V7 W/S
W/S
プロバイダ側
プロバイダ側のバインディングとして以下のいずれかを指定
@BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_MTOM_BINDING)
@BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_MTOM_BINDING)
リクエスタ側
javax.xml.ws.soap.SOAPBinding#setMTOMEnabled()を使用
Service#addPort()を使用してMTOMを有効化(Dispatchのみ)
MTOMFeatureを使用
New
v7
base64Binary、もしくはhexBinaryで定義されたフィールドが自動的にMIMEの別
パートとしてパッケージングされる。
WebSphere Application Server V7
Announcement Workshop 2008
# 60
© IBM Corporation.
MTOMのプログラミングモデルになります。Webサービスウィザードを使用して、「MTOMの
使用可能可」を設定することも可能です。詳細は、 『WAS v6.1 SOA Webサービスワーク
ショップ資料』の「MTOM」を参考にしてください。
プロバイダーのプログラミングモデルでは、サーバーのエンドポイント実装クラスで、
@BindingTypeアノテーションを設定することで、応答メッセージをMTOMにすることが可能で
す。値としては、SOAP1.1を使用するか、SOAP1.2を使用するかによって2種類用意されてい
ます。
リクエスターのプログラミングモデルとしては、3種類あります。MTOMFeatureを使用する方
法は、WAS V7よりサポートされました。これは、JAX-WS 2.1から使用できるようになった
Featureクラスを使用した設定方法になります。Dispatchクライアントでは、
SOAPBinding.setMTOMEnabled()を使用、もしくは
Service.addPort(SOAPBinding.SOAP11HTTP_MTOM_BINDING)を使用、もしくは
MTOMFeatureを使用することができます。動的プロキシークライアントでは、
SOAPBinding.setMTOMEnabled()もしくは、MTOMFeatureクラスが使用できます。
60
(参考)リクエスタでのコーディング例
WAS
WAS V7
V7 W/S
W/S
Dispatchの場合
setMTOMEnabled() を使った例
SOAPBinding binding = (SOAPBinding)dispatch.getBinding();
binding.setMTOMEnabled(true);
addPort()を使用した例
Service svc = Service.create(serviceName);
svc.addPort(portName,SOAPBinding.SOAP11HTTP_MTOM_BINDING,endpointUr
l);
MTOMFeatureを使用した例
New
v7
MTOMFeature mtom = new MTOMFeature();
Service svc = Service.create(serviceName);
svc.addPort(portName,SOAPBinding.SOAP11_HTTP_BINDING,endpoin
tUrl);
Dispatch<Source> dsp =
svc.createDispatch(portName,Source.class,Service.Mode.PAYLOAD,
mtom);
WebSphere Application Server V7
Announcement Workshop 2008
# 61
© IBM Corporation.
61
(参考)リクエスタでのコーディング例
WAS
WAS V7
V7 W/S
W/S
動的プロキシの場合
setMTOMEnabled()を使った例
Service svc = Service.create(serviceName);
MtomSample proxy =
svc.getPort(portName,MtomSample.class);
BindingProvider bp = (BindingProvider) proxy;
SOAPBinding binding =
(SOAPBinding)bp.getBinding();
binding.setMTOMEnabled(true);
MTOMFeatureを使用した例
New
v7
MTOMFeature mtom = new MTOMFeature();
MtomSample proxy = svc.getPort(portName,MtomSample.class,
mtom);
WebSphere Application Server V7
Announcement Workshop 2008
# 62
© IBM Corporation.
62
Summary
WAS
WAS V7
V7 W/S
W/S
WAS V7では、Webサービス仕様の最新バージョン(JAX-WS2.1、
JAXB2.1)をサポート
WAS V7では、JSR109 V1.2をサポート
EJB実装によるJAX-WSアプリケーションの作成が可能
JAX-WSクライアントにおいて、サービス参照のためのアノテーション
(@WebServiceRef)が使用可能
WAS V7では、IBM拡張で実装されていたSOAP/JMSが、W3C準拠の
Standard SOAP/JMSに変更
WebサービスのトランスポートプロトコルはHTTP or JMSの選択が可能
メッセージ交換パターン(同期型、片方向型、非同期型双方向)の選択が
可能
JAX-WSでは、非同期型プログラミング(コールバック、ポーリング)を
サポート
JAX-WS2.1では、Featureクラスのサポート
例)MTOMFeature
WebSphere Application Server V7
Announcement Workshop 2008
# 63
© IBM Corporation.
63
Reference
WAS
WAS V7
V7 W/S
W/S
WAS V6.1 SOA Webサービスワークショップ資料
http://www.ibm.com/developerworks/jp/websphere/library/was/was61_soa_ws/
EJB 3.0 Feature Pack for WAS V6.1 ワークショップ資料
http://www.ibm.com/developerworks/jp/websphere/library/was/was61_ejb3fep_ws/
SOA Webサービス及びESB基盤構築ワークショップ資料
http://www.ibm.com/developerworks/jp/websphere/library/esb/soainfra_ws/
WAS V6.1 WebSphere Application Server 最新動向ワークショップ(2007年4月版)
http://www.ibm.com/developerworks/jp/websphere/library/was/was61_updatews/
WebSphere Application Server V6.1による基幹システム設計ワークショップ資料
http://www.ibm.com/developerworks/jp/websphere/library/was/was61_guide/
JSR-000244 JavaTM Platform, Enterprise Edition 5 Specification
http://jcp.org/aboutJava/communityprocess/final/jsr244/index.html
JSR-000109 Implementing Enterprise Web Services
http://jcp.org/aboutJava/communityprocess/mrel/jsr109/index.html
The Java API for XML-Based Web Services (JAX-WS) 2.1
http://jcp.org/en/jsr/detail?id=224
The Java API for XML-Based RPC(JAX-RPC)1.1
http://jcp.org/en/jsr/detail?id=101
WSDL 1.1
http://www.w3.org/TR/wsdl
Basic Profile 1.1
http://www.ws-i.org/Profiles/BasicProfile-1.1.html
Basic Profile 1.2
http://www.ws-i.org/Profiles/BasicProfile-1_2(WGAD).html
WAS V7 Information Center
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.html
WebSphere Application Server V7
Announcement Workshop 2008
# 64
© IBM Corporation.
64
Fly UP