Oracle Application Server Web Services開発者ガイド 10g(10.1.3.1.0) B31868-01 |
|
この章では、Oracleデータベースと対話できるOracle Application Server Web Servicesを開発する方法について説明します。OracleAS Web Servicesがデータベースと対話するには、コールインおよびコールアウトの2つの方法があります。Webサービスのコールインとは、データベース・リソースにアクセスするWebサービスを提供することです。WebサービスはOC4Jインスタンス上で動作し、JDBCを介してデータベース・リソースにアクセスします。
Webサービスのコールアウトとは、データベース内から外部Webサービスを起動することです。起動は、データベース内で実行されるSQL、PL/SQLまたはJavaコードから行われます。
この章の項目は、次のとおりです。
Webサービスのテクノロジを使用すると、Webを介することで、プラットフォーム、言語またはデータ・フォーマットにかかわらず、アプリケーション間の対話が可能になります。XML、SOAP、WSDL、UDDI、WS-SecurityおよびWS-Reliabilityなどの主要要素は、ソフトウェア業界全体で採用されています。Webサービス・テクノロジは、通常中間層のアプリケーション・サーバーに実装およびデプロイされるサービスを指しています。ただし、異機種間で接続されていない環境では、ストアド・プロシージャ、データおよびメタデータへのWebサービス・インタフェース経由でのアクセス要求が増大しています。データベースWebサービス・テクノロジは、Webサービスに対するデータベースからのアプローチです。アプローチには2方向あります。
OracleデータベースをWebサービス・プロバイダとして使用することで、Javaストアド・プロシージャ、PL/SQLパッケージ、アドバンスト・キュー、事前定義済SQL問合せおよびDMLへの投資を有効活用できます。クライアント・アプリケーションは、標準Webサービス・プロトコルを使用して、Oracleデータベースへのデータの問合せおよび取得、ならびにストアド・プロシージャの起動ができます。Oracle固有のデータベース接続プロトコルへの依存性はありません。アプリケーションはキャッシュされている任意のOC4J接続を使用できます。このアプローチは異機種間で接続されていない分散環境では特に有効です。
データベースWebサービスはOracleAS Web Servicesの一部であるため、整合性のある均一な開発/デプロイ環境に統合できます。Webサービスで公開されたデータベースとWebサービス・クライアントの間で交換されるメッセージを使用することで、OracleAS Web Servicesが提供するセキュリティ、信頼性、監査およびロギングなどの管理機能をすべて活用できます。
図10-1はWebサービスのコールインの説明図です。次の各ステップは、そのプロセスの説明です。
PL/SQLパッケージ、SQL問合せ、DML文、Oracle AQストリームまたはサーバー・サイドJavaクラスのデータベース操作のWebサービスとしての公開の詳細は、「データベース・リソースを公開するWebサービスの開発」を参照してください。
関連項目
Webサービスが組み込まれるように、リレーショナル・データベースの格納、索引付けおよび検索機能を拡張することができます。データベースからWebサービスをコールし、株価、為替レートまたは天気情報などのオンデマンドで生成される動的なデータの追跡、集約、リフレッシュおよび問合せが可能です。サービス・コンシューマとしてのデータベースの使用例として、複数のサプライヤからの在庫情報の取得およびローカルの在庫データベースの更新を行う、事前定義済データベース・ジョブからの外部Webサービスのコールがあげられます。もう1つの例として、Webクローラがあります。たとえば、複数の仕入先の製品/価格情報を照合するようにスケジュールされたデータベース・ジョブがそれです。
図10-2はデータベースのコールアウトの説明図です。
UTL_DBWS
PL/SQLパッケージを使用した、動的なWebサービスの起動。Call
オブジェクトはWSDLをベースにして動的に作成でき、作成後にWebサービス操作を起動できます。 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』には、UTL_DBWS
PL/SQLパッケージの使用方法についての詳細な説明があります。
使用するメソッドは、起動元がSQLまたはPL/SQLか、それともJavaクラスであるかによって異なり、また、サービスが事前に認識されているか(静的起動)または実行時に初めて認識されるか(DII)によっても異なります。
関連項目
OracleAS Web Servicesが提供するデータベースからのPL/SQLおよびJavaコールアウトに対するサポートの詳細は、「データベースにおけるWebサービス・クライアントの開発」を参照してください。 |
次の項では、Webサービスが事前に認識されている場合(静的起動)の、コールインおよびコールアウトで使用するSQLとXMLの間の型マッピングについて説明します。
Webサービスを実行時に認識させる場合は、Dynamic Invocation Interface(DII)またはUTL_DBWS
PL/SQLパッケージのみを使用できます。JAX-RPC DIIの使用方法の詳細は、次のWebアドレスのAPIの記述を参照してください。
http://java.sun.com/j2ee/1.4/docs/#api
データベースWebサービスのコールインでは、PL/SQLストアド・プロシージャやSQL文などのSQL操作は、1つ以上のWebサービス操作にマッピングされます。SQL操作のパラメータはSQL型からXML型にマッピングされます。
表10-1は、Webサービスのコールインで使用されるSQLからXMLへの型マッピングを示します。最初の列に記載されているのはSQL型です。表の2番目の列XML型(literal)は、use
属性のデフォルトであるliteral
値に関するSQLからXMLへの型マッピングを示します。3番目の列XML型(encoded)は、use
属性のencoded
値に関するマッピングを示します。literal
値およびencoded
値は、SOAPメッセージ・ボディのエンコーディング・ルールのことです。
REF
CURSOR
を戻す問合せまたはPL/SQLファンクションは、nameBeans
、nameXMLRowSet
およびnameXML
の3つのメソッドにマッピングされます。nameは問合せまたはPL/SQLファンクションの名前です。
Beans
: このメソッドは配列を戻します。各要素はXSD複合型のインスタンスであり、カーソルの1つの行を表します。複合型のサブ要素はその行の列に対応します。
XMLRowSet
: このメソッドは、XML形式のOracleWebRowSet
インスタンスを含んだswaRef
またはtext_xml
レスポンスを戻します。swaRef
MIME形式の詳細は、『Oracle Application Server Web Servicesアドバンスト開発者ガイド』のMIME添付ファイルの処理に関する項を参照してください。
XML
: このメソッドは、Oracle XDB
行セットを含んだXML any
またはtext_xml
のレスポンスを戻します。
OUT
およびIN
OUT
PL/SQLパラメータの両方が、WSDLファイルのIN
OUT
パラメータにマッピングされます。
関連項目
|
表10-1には、2つの異なるマッピングが記載されている点に注意してください。use
がliteralの場合とencodedの場合です。デフォルトのマッピングはliteralです。データベースWebサービスにとっては、encodedを使用する必要性は特にありません。encoded用のマッピングが提供されているのは、use
="encoded"設定が必要になった場合に備えてです。特に指定のないかぎり、この章の説明では、use
="literal"設定を使用していることを前提にしています。
表10-1は、コールインで使用するSQLからXMLへの型マッピングを定義しています。数値型のマッピングは、Oracle JPublisherによるSQL型のJava型へのマッピング方法によって決定されています。Oracle JPublisherのオプション-numbertypes=objectjdbc
が、WebServicesAssemblerツールによってデフォルトで使用されています。このため、SQLの数値型に対応するXML型は、生成されるWSDLファイルではすべてNULL値可能として宣言されます。
Oracle JPublisherのマッピングを変更し、それによってXML型を変更するには、WebServicesAssemblerのjpubProp
引数を使用できます。たとえば、次の引数をデータベースのWebServicesAssemblerのAntタスクで指定すると、SQLの数値型に対して生成されるXML型は、NULL値可能として宣言されることはなくなります。
jpubProp="numbertypes=jdbc"
一方で、oracle
またはbigdecimal
をnumbertypes
オプションのターゲットとして指定すると、SQL数値型に対して生成されるXML型はすべてdecimal
となり、NULL値可能になります。
データベースWebサービスのコールアウトでは、XML型がSQL型にマッピングされます。表10-2に、コールアウトで使用されるXMLからSQLへの型マッピングを示します。
XML型 | SQL型 |
---|---|
int |
NUMBER |
float |
NUMBER |
double |
NUMBER |
decimal |
NUMBER |
dateTime |
DATE |
String |
VARCHAR2 |
byte[] |
RAW |
complexType |
SQL OBJECT |
Array |
SQL TABLE |
text_xml |
XMLType |
この項では、PL/SQLストアド・プロシージャ、SQL文、Oracle Streams AQキューおよびサーバー・サイドJavaクラスとして実装されるWebサービスの開発方法について説明します。
データベースWebサービスのコールイン・アプリケーションの作成は、ボトムアップ・プロセスです。多くの場合、既存のデータベース・アプリケーション(PL/SQLパッケージまたはJavaアプリケーションなど)または操作スクリプト(SQL問合せ、DMLまたはAQなど)の再利用を考えるはずです。また、Webサービスとして公開するリソースをデータベースに移入することもできます。Webサービスのコールインは、通常次の各ステップを取ります。
たとえば、リソースは次のいずれかの方法で提供できます。
なお、Oracle JDeveloperを使用してもWebサービスをアセンブルできます。
PL/SQLレコードまたは表タイプINDEX BY
がPL/SQLパッケージに含まれている場合、PL/SQL Webサービスをアセンブルすると、ラッパーが生成されます。生成されたラッパーはデータベースにロードする必要があります。サーバー・サイドJavaのコールインをアセンブルすると、常にPL/SQLラッパーが生成されます。sysUser
引数が設定されている場合、WebServicesAssemblerはラッパーを自動的にロードします。詳細は、sysUserを参照してください。
なお、Oracle JDeveloperを使用してもPL/SQLラッパーをデータベースにロードできます。
J2EEデータソース・ファイルにデータソース・エントリを追加し、Webサービス・アプリケーションがデータベースに接続できるようにします。
Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。
WebServicesAssemblerツールの次の引数は、Webサービスのコールイン・タイプのすべてに対して必須です。
appName
引数には、Webサービス・アプリケーション名を指定します。dataSource
引数は、アクセス対象のデータベース用に、データソースのJNDI位置を定義します。実行時には、Webサービスのコードは、このデータソースを介してデータベースにアクセスします。
WebServicesAssemblerツールは、Webサービス作成時に、dbConnection
およびdbUser
引数を使用してデータベースへの接続を定義します。これらの引数の値はコード生成時に使用され、実行時には使用されません。dbConnection
引数は、公開対象のリソースに関する情報へのアクセスに使用します。たとえば、PL/SQLパッケージ、スキーマまたは問合せに関する情報へのアクセスに使用します。
Webサービスの作成時に使用するデータベースは、実行時に使用するデータベースと同じである必要はありません。ただし、どちらにも公開対象のデータベース・リソースを含むスキーマがある必要があります。
実行時には、データベースWebサービスはこのデータソースからデータベースへの接続を取得します。データベースWebサービスは、接続が失われるとデータベースへの再接続を行います。接続の状態が無効になると、Webサービスは接続の再確立を試行します。Webサービスは、再接続に失敗すると、フォルトを戻します。その次の回にクライアントがWebサービスを起動すると、Webサービスはデータベースへの接続を試行します。したがって、接続失敗の処理が原因でWebサービスが一時的にフォルトを戻しても、その後正常に接続できる場合があります。
次の引数はオプションであり、Webサービスのすべてのコールインのケースで使用できます。
style
部分
use
部分
公開対象リソースがデータベースに移入されていることが、すべてのコールインタイプに共通の前提条件になります。WebServicesAssemblerはOracle JPublisherを使用し、データベース・リソースにアクセスするJavaコードを生成します。jpubProp
引数は、コマンドラインまたはAntタスクで複数回使用でき、Oracle JPublisherにオプションを渡します。
plsqlAssemble
コマンドを使用して、WebサービスをPL/SQLストアド・プロシージャからアセンブルします。生成されるWebサービスでは、各Webサービス操作が1つのPL/SQLストアド・プロシージャに対応します。
この項の内容は、次のとおりです。
開始する前に、次のファイルと情報を用意してください。
次の手順は、PL/SQLパッケージecho_plsql
に対するWebサービスのアセンブル方法について説明しています。
plsqlAssemble
コマンドに入力します。コマンドライン:
java -jar wsa.jar -plsqlAssemble -appName Echo -sql echo_plsql -dataSource jdbc/OracleManagedDS -dbConnection jdbc:oracle:thin:@stacd15:1521:lsqlj -dbUser scott/tiger -style rpc -use encoded
Antタスク:
<oracle:plsqlAssemble dbUser="scott/tiger" sql="echo_plsql" dbConnection="jdbc:oracle:thin:@stacd15:1521:1sqlj" dataSource="jdbc/OracleManagedDS" appName="EchoPlsql" style="rpc" use="encoded" />
このコマンドおよびAntタスクの説明:
plsqlAssemble
: ストアド・プロシージャとファンクションを含むPL/SQLパッケージからWebサービスを生成します。このコマンドを使用するには、データベースに接続する必要があります。「plsqlAssemble」を参照してください。
appName
: アプリケーションの名前を指定します。この名前は、通常context
やuri
などの他の引数のベース値として使用されます。「appName」を参照してください。
sql
: PL/SQLのパッケージ名を指定します。「sql」を参照してください。
dataSource
: 実行時にWebサービスによって使用されるデータソースのJNDI位置を指定します。「dataSource」を参照してください。
dbConnection
: データベースのJDBC URLを指定します。「dbConnection」を参照してください。
dbUser
: user/
passwordの形式でデータベースのスキーマとパスワードを指定します。「dbUser」を参照してください。
style
: ボトムアップ方式Webサービス・アセンブリの場合、この引数は、生成されるWSDL内のメッセージ書式のstyle
属性を指定します。「style」を参照してください。
use
: ボトムアップ方式Webサービス・アセンブリの場合、この引数は、生成されるWSDL内のメッセージ書式のuse
属性を指定します。「use」を参照してください。
plsqlAssemble
コマンドで使用可能な引数は、「plsqlAssemble」を参照してください。
デフォルトでは、WebServicesAssemblerはdocument-wrappedスタイルを使用してサービスを生成します。ただし、document-wrappedスタイルを使用するJAX-RPCクライアントは、IN
OUT
パラメータを直接サポートしません。WebServicesAssemblerはそのかわりに、IN
パラメータとIN OUT
パラメータを個別にパッケージ化します。この例で使用されているPL/SQLパッケージは、IN
OUT
パラメータを含んでおり、plsqlAssemble
コマンドには-style rpc
引数が含まれています。パラメータおよび各種ドキュメント・スタイルの詳細は、「クライアント・コードからPL/SQLのINおよびIN OUTパラメータにアクセスする方法」を参照してください。
このコマンドにより、Webサービス・アプリケーションEchoPlsql.ear
が生成されるとともに、オプションで次のPL/SQLスクリプトが生成されます。
PL/SQL WebサービスのアセンブリではPL/SQLラッパーが生成されない場合もあります。生成された場合は、Webサービスの実行前にデータベースの適切なユーザー・スキーマにロードする必要があります。
ラッパーは自動または手動でロードできます。ラッパーを自動でロードするには、次の行をplsqlAssemble
コマンドに追加します。
-jpubProp plsqload
(コマンドラインの場合)、または
jpubprop="plsqlload"
(Antタスクの場合)
Webサービスのアセンブリ後にラッパー・パッケージを手動でロードするには、SQL*PLUSを使用します。次のコマンドラインは、ラッパー・パッケージをロードするためのサンプルSQL*PLUSコマンドです。
SQL>@Echo_plsql_wrapper.sql
ステップ1の-dataSource
引数で参照しているデータソースがこのOC4Jインスタンスに設定されている必要があります。
次のコマンドラインは、サンプルのデプロイおよびバインドのコマンドです。
% java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome -deploy -file dist/echo.ear -deploymentName echo % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome -bindWebApp plsql plsql-web default-web-site /plsql
この例において、<J2EE_HOME
>は、J2EEのインストール・ディレクトリです。
EARファイルのデプロイの詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。
OracleAS Web Servicesでは、デプロイされたWebサービスごとにWebサービス・テスト・ページが提供されます。Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。
genProxy
コマンドを使用してWebServicesAssemblerツールを実行し、J2SE Webサービス・クライアントのスタブ(クライアント・プロキシ)を生成します。J2SE環境向けのクライアント・サイド・コードの生成およびアセンブルの詳細は、第15章「J2SE Webサービス・クライアントのアセンブル」を参照してください。
genInterface
コマンドを使用してWebServicesAssemblerツールを実行し、J2EE Webサービス・クライアント用のJAX-RPCマッピング・ファイルおよびサービス・エンドポイント・インタフェースを生成します。クライアント・サイド・コードの生成およびアセンブルの詳細は、第14章「J2EE Webサービス・クライアントのアセンブル」を参照してください。
たとえば、次のコマンドはgenProxy
コマンドを使用してJ2SEクライアントをbuild/classes/client
ディレクトリに生成します。
% java -jar wsa.jar -genProxy -wsdl http://locahost:8888/plsql/echo?WSDL -output build/src/client -mappingFileName ./mapping.xml -packageName oracle.demo.db.plsql.stub -unwrapParameters true
このコマンドの説明:
genProxy
: J2SE Webサービス・クライアントから使用可能な静的プロキシ・スタブを作成します。「genProxy」を参照してください。
wsdl
: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。
output
: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。
mappingFileName
: JAX-RPCマッピング・ファイルを指すファイル位置を指定します。「mappingFileName」を参照してください。
packageName
: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。
unwrapParameters
: この引数はdocument-literal操作に対してのみ設定でき、その他のメッセージ書式では無視されます。unwrapParameters
をtrue
に設定すると(デフォルト)、戻り型とレスポンス・タイプがアンラップされます。通常はこの方が使いやすくなります。特にタイプが単純な場合はそうです。「unwrapParameters」を参照してください。
クライアントをコンパイルする前に、クラスパス上にある適切なJARをリストします。クライアントのクラスパスで使用可能なすべてのJARファイルのリストについては、表A-2「クライアント・サイド・プロキシを使用するクライアントのクラスパス・コンポーネント」を参照してください。個々のJARをリストするかわりに、クライアントのクラスパスにクライアント側のJARとしてwsclient_extended.jar
を含めることができます。このJARファイルには、Webサービス・クライアントをコンパイルおよび実行するために必要なすべてのクラスが含まれます。これらのクラスは、表A-2にリストされている各JARファイルに含まれているものです。wsclient_extended.jar
およびクライアントのクラスパスの詳細は、「Webサービス・プロキシのクラスパスの設定」を参照してください。
次のコマンドラインは、サンプルのコンパイルおよび実行のコマンドです。
% javac -classpath path: <ORACLE_HOME>/webservices/lib/wsclient_extended.jar: :<ORACLE_HOME>/webservices/lib/jaxrpc-api.jar EchoClient.java % java -classpath path: <ORACLE_HOME>/webservices/lib/wsclient_extended.jar: <ORACLE_HOME>/webservices/lib/jaxrpc-api.jar: <J2EE_HOME>/lib/jax-qname-namespace.jar: <J2EE_HOME>/lib/activation.jar: <J2EE_HOME>/lib/mail.jar: <J2EE_HOME>/lib/http_client.jar: <ORACLE_HOME>/lib/xmlparserv2.jar EchoClient
この例において、<J2EE_HOME
>はJ2EEのインストール・ディレクトリであり、<ORACLE_HOME
>にOracleAS Web Servicesがインストールされています。
例10-1は、Webサービスとして公開可能な、データベース内のPL/SQLパッケージを示しています。このパッケージには、各種SQLおよびPL/SQLデータ型を使用するプロシージャおよびファンクションが含まれています。
create or replace type address as object( street varchar2(30), city varchar2(30), state varchar2(2), zip varchar2(5)); create or replace type employee as object (eid int, efirstname varchar(30), elastname varchar(30), addr address, salary float); create table employees (eid int, emp employee); create table employee_espp (eid int, status int); create table employee_accounts (eid int, accounts sys.xmltype); create table employee_biodata (eid int, biodata CLOB); create table employee_image (eid int, image BLOB); create table employee_hiredate(eid int, hiredate TIMESTAMP); create or replace package echo_plsql as procedure set_object (emp IN employee); function get_object1(id IN int) return employee; function get_object2(id IN int) return address; function hold_varchar(id IN int, firstname OUT varchar2, lastname OUT varchar2) return float; procedure set_boolean(id IN int , status IN boolean); function get_boolean(id IN int) return boolean; procedure hold_float_inout(id IN int, newsalary IN OUT float); procedure clear_object (id IN int); procedure set_clob (id int, biodata IN CLOB); function get_clob(id IN int) return CLOB; procedure set_blob(id int, image IN BLOB); function get_blob(id IN int) return BLOB; procedure set_xmltype(id IN number, accounts sys.xmltype); function get_xmltype(id IN number) return sys.xmltype; procedure set_date(id IN int, hiredate IN TIMESTAMP); function get_date(id IN int) return TIMESTAMP; TYPE rec is RECORD (emp_id int, manager_id int); TYPE index_tbl is TABLE OF rec INDEX BY BINARY_INTEGER; function echo_rec(mrec rec) return rec; function echo_index_tbl(mtbl index_tbl) return index_tbl; end echo_plsql;
WebServicesAssemblerは、PL/SQLのファンクションまたはプロシージャをWebサービス操作にマッピングします。このとき、通常は名前が変更されます。通常、PL/SQL名のアンダースコアが取り除かれ、アンダースコアの次の文字が大文字になります。たとえば、例10-1のPL/SQLファンクションecho_index_tbl
に注目してみます。このファンクションはWebサービス操作echoIndexTbl
にマッピングされます。例10-2のWSDLフラグメントでは、PL/SQLファンクションecho_index_tbl
がWebサービス操作echoIndexTbl
として表現されています。
<operation name="echoIndexTbl" parameterOrder="EchobaseIndexTblBase_1"> <input message="tns:Echo_echoIndexTbl"/> <output message="tns:Echo_echoIndexTblResponse"/> </operation>
例10-1のPL/SQLパラメータOUT
およびIN
OUT
は、XMLではIN
OUT
パラメータとして表現されており、holdVarchar
のホルダー・パラメータとして使用されています。例10-3のWSDLフラグメントのエントリはholdVarchar
操作を示しています。2番目および3番目のパラメータは入力メッセージおよび出力メッセージの両方で使用されており、どちらのパラメータもIN OUTパラメータであることがわかります。
<operation name="holdVarchar" parameterOrder="Integer_1 String_2 String_3"> <input message="tns:Echo_holdVarchar"/> <output message="tns:Echo_holdVarcharResponse"/> </operation> <message name="Echo_holdVarchar"> <part name="Integer_1" type="xsd:int"/> <part name="String_2" type="xsd:string"/> <part name="String_3" type="xsd:string"/> </message> <message name="Echo_holdVarcharResponse"> <part name="result" type="ns1:double"/> <part name="String_2" type="xsd:string"/> <part name="String_3" type="xsd:string"/> </message>
JAX-RPCクライアント・コードのIN
OUT
パラメータにアクセスするには、JAX-RPCホルダーを使用する必要があります。たとえば、例10-4のコードは戻り値をfirstName.value
およびlastName.value
として取得します。ここでfirstName
およびlastName
はどちらもStringホルダーです。ホルダーの実際の値には、println
文で示しているようにメンバーvalue
を使用してアクセスします。
System.out.println("holdVarchar"); StringHolder firstName = new StringHolder("Tom"); StringHolder lastName = new StringHolder("Gordon"); System.out.println("Holder returned: empid=" + ci.holdVarchar(id, firstName, lastName) + ", name=" + firstName.value + "." + lastName.value);
plsqlAssemble
コマンドラインに-style rpc
が指定されている点に注意してください。rpcスタイルではホルダーがサポートされています。デフォルトのdocument-wrappedスタイルではホルダーはサポートされていません。
Webサービスがデフォルトのdocument-wrappedスタイルを使用して作成されている場合は、異なるholdVarchar
シグネチャが生成されています。OUT
引数は属性として戻り値に取得されます。
次のWSDLセグメントはdocument-wrappedスタイルにおけるholdVarchar
操作を示しています。戻り型EchoUser_holdVarchar_Out
では、属性lastnameOut
およびfirstnameOut
に、PL/SQLパラメータfirstname
およびlastname
のOUT
値が記録されます。
<operation name="holdVarchar" parameterOrder="Integer_1"> <input message="tns:Echo_holdVarchar"/> <output message="tns:Echo_holdVarcharResponse"/> </operation> <message name="Echo_holdVarchar"> <part name="Integer_1" type="xsd:int"/> </message> <message name="Echo_holdVarcharResponse"> <part name="result" type="tns:Echo_holdVarchar_Out"/> </message> <complexType name="Echo_holdVarchar_Out"> <sequence> <element name="return" type="double" nillable="true"/> <element name="lastnameOut" type="string" nillable="true"/> <element name="firstnameOut" type="string" nillable="true"/> </sequence> </complexType>
例10-1のSQL XMLType
は、XML any
型にマッピングされます。このマッピングは、例10-6のWSDLフラグメントのgetXmltype
操作で示されています。
<message name="Echo_getXmltypeResponse"> <part name="result" type="ns2:any"/> </message> <operation name="getXmltype" parameterOrder="BigDecimal_1"> <input message="tns:Echo_getXmltype"/> <output message="tns:Echo_getXmltypeResponse"/> </operation>
WebServicesAssemblerは、XML any
をJava型org.w3c.org.dom.Element
にマッピングするプロキシを生成します。したがって、JavaクライアントはSQL XMLType
インスタンスにElement
インスタンスとしてアクセスします。
sqlAssemble
コマンドを使用して、WebサービスをSQL文から生成します。文にはSQL問合せおよびDML(Data Manipulation Language)文を含むことができます。
PL/SQL Webサービスの生成とは異なり、SQL文をアセンブルしても、PL/SQLラッパーは生成されません。PL/SQLラッパーはPL/SQLレコード
またはINDEX BY
表タイプを処理する場合のみ生成されます。これらのタイプはSQL文では使用されません。
この項の内容は、次のとおりです。
開始する前に、次のファイルと情報を用意してください。
複数のsqlstatement
引数をコマンドラインまたはAntタスクに指定できます。sqlstatement
引数の書式の詳細は、「sqlstatement」を参照してください。
次の手順では、sqlAssemble
コマンドを使用し、SCOTTスキーマに基づいて問合せおよび文のWebサービスをアセンブルします。
sqlAssemble
コマンドに対する入力として使用します。 たとえば、次のコマンドはWebサービス・アプリケーションquery.ear
を生成します。
コマンドライン:
java -jar wsa.jar -sqlAssemble -appName query -dataSource jdbc/OracleManagedDS -sqlstatement "getEmpCount=select ename, sal from emp where sal>:{mysal NUMBER}" -sqlstatement "getEmpBySal=select ename, sal from emp where sal>:{mysal NUMBER}" -sqlstatement "updateEmp=update emp SET sal=sal+500 where ename=:{myname VARCHAR}" -dbConnection jdbc:oracle:thin:@stacd15:1521:lsqlj -dbUser scott/tiger
Antタスク:
<oracle:sqlAssemble appName="query" dataSource="jdbc/OracleManagedDS" dbConnection="jdbc:oracle:thin:@dsunrde22:1521:sqlj" dbUser="scott/tiger"> <sqlstatement="getEmpCount=select ename, sal from emp where sal>:{mysal NUMBER}"/> <sqlstatement="getEmpBySal=select ename, sal from emp where sal>:{mysal NUMBER}"/> <sqlstatement="updateEmp=update emp SET sal=sal+500 where ename=:{myname VARCHAR}"/> />
このコマンドおよびAntタスクの説明:
sqlAssemble
: SQL問合せやデータ操作言語(DML)などのSQL文からWebサービスを生成します。このコマンドを使用するには、データベースに接続する必要があります。「sqlAssemble」を参照してください。
appName
: アプリケーションの名前を指定します。この名前は、通常context
やuri
などの他の引数のベース値として使用されます。「appName」を参照してください。
dataSource
: 実行時にWebサービスによって使用されるデータソースのJNDI位置を指定します。「dataSource」を参照してください。
dbConnection
: データベースのJDBC URLを指定します。「dbConnection」を参照してください。
dbUser
: user/
passwordの形式でデータベースのスキーマとパスワードを指定します。「dbUser」を参照してください。
sqlStatement
: Webサービスとして公開するDML文またはSQL問合せを指定します。「sqlstatement」を参照してください。
-dataSource
引数で参照しているデータソースがこのOC4Jインスタンスに設定されている必要があります。
次のコマンドラインは、サンプルのデプロイおよびバインドのコマンドです。
% java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome -deploy -file dist/query.ear -deploymentName query % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome -bindWebApp plsql plsql-web default-web-site /query
このサンプル・コマンドラインの<J2EE_HOME
>は、J2EEのインストール・ディレクトリです。
EARファイルのデプロイの詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。
genProxy
コマンドを使用してWebServicesAssemblerツールを実行し、J2SE Webサービス・クライアントのスタブ(クライアント・プロキシ)を生成します。J2SE環境向けのクライアント・サイド・コードの生成およびアセンブルの詳細は、第15章「J2SE Webサービス・クライアントのアセンブル」を参照してください。
genInterface
コマンドを使用してWebServicesAssemblerツールを実行し、J2EE Webサービス・クライアント用のJAX-RPCマッピング・ファイルおよびサービス・エンドポイント・インタフェースを生成します。クライアント・サイド・コードの生成およびアセンブルの詳細は、第14章「J2EE Webサービス・クライアントのアセンブル」を参照してください。
たとえば、次のコマンドはgenProxy
を使用してJ2SEクライアントのコードを生成します。
% java -jar wsa.jar -genProxy -wsdl http://locahost:8888/query/query?WSDL -output build/src/client -mappingFileName ./mapping.xml -packageName oracle.demo.db.query.stub -unwrapParameters true
このコマンドはディレクトリbuild/src/client
にクライアントを生成します。
このコマンドの説明:
genProxy
: J2SE Webサービス・クライアントから使用可能な静的プロキシ・スタブを作成します。「genProxy」を参照してください。
wsdl
: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。
output
: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。
mappingFileName
: JAX-RPCマッピング・ファイルを指すファイル位置を指定します。「mappingFileName」を参照してください。
packageName
: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。
unwrapParameters
: この引数はdocument-literal操作に対してのみ設定でき、その他のメッセージ書式では無視されます。unwrapParameters
をtrue
に設定すると(デフォルト)、戻り型とレスポンス・タイプがアンラップされます。通常はこの方が使いやすくなります。特にタイプが単純な場合はそうです。「unwrapParameters」を参照してください。
クライアントをコンパイルする前に、クラスパス上にある適切なJARをリストします。クライアントのクラスパスで使用可能なすべてのJARファイルのリストについては、表A-2「クライアント・サイド・プロキシを使用するクライアントのクラスパス・コンポーネント」を参照してください。個々のJARをリストするかわりに、クライアントのクラスパスにクライアント側のJARとしてwsclient_extended.jar
を含めることができます。このJARファイルには、Webサービス・クライアントをコンパイルおよび実行するために必要なすべてのクラスが含まれます。これらのクラスは、表A-2にリストされている各JARファイルに含まれているものです。wsclient_extended.jar
およびクライアントのクラスパスの詳細は、「Webサービス・プロキシのクラスパスの設定」を参照してください。
次のコマンドラインは、サンプルのコンパイルおよび実行のコマンドです。
% javac -classpath path: <ORACLE_HOME>/webservices/lib/wsclient_extended.jar: :<ORACLE_HOME>/webservices/lib/jaxrpc-api.jar QueryClient.java % java -classpath path <ORACLE_HOME>/webservices/lib/wsclient_extended.jar: <ORACLE_HOME>/webservices/lib/jaxrpc-api.jar: <J2EE_HOME>/lib/jax-qname-namespace.jar: <J2EE_HOME>/lib/activation.jar: <J2EE_HOME>/lib/mail.jar: <J2EE_HOME>/lib/http_client.jar: <ORACLE_HOME>/webservices/lib/commons-logging.jar: <ORACLE_HOME>/lib/xmlparserv2.jar QueryClient
この例において、<J2EE_HOME
>はJ2EEのインストール・ディレクトリであり、<ORACLE_HOME
>はOC4Jのインストール・ディレクトリです。
例10-7は、Webサービスとして公開されるSQL文の定義を示しています。
getEmpCount=select ename, sal from emp where sal>:{mysal NUMBER} getEmpBySal=select ename, sal from emp where sal>:{mysal NUMBER} updateEmp=update emp SET sal=sal+500 where ename=:{myname VARCHAR}
SQL問合せは、Webサービスとして公開されると、3つのサービス操作にマッピングされます。たとえば、例10-7のgetEmpBySal
問合せにより、次のサービス操作が生成されます。
getEmpBySal
Beans: 配列を戻します。配列要素は、問合せ結果の行内の列に対応した各属性を持ったオブジェクト・タイプです。
getEmpBySal
XMLRowSet: WebRowSet
形式の問合せ結果が入ったXML文書を戻します。
getEmpBySal
XML: Oracle XDB
行セット書式の問合せ結果が入ったXML文書を戻します。
1つの問合せから3つの操作が生成されるので、便利です。戻り値の違いは形式のみです。なお、オリジナルの問合せ名にBeans
、XMLRowSet
およびXML
を付加するネーミング規則になっています。
例10-8のWSDLフラグメントでは、WSDLファイルの3つの操作の戻り型を説明しています。
<complexType name="getEmpBySalBeansResponse"> <sequence> <element name="result" type="tns:Query_getEmpBySalRowUser" nillable="true" minOccurs="0" maxOccurs="unbounded"/> </sequence> </complexType> <complexType name="Query_getEmpBySalRowUser"> <sequence> <element name="ename" type="string" nillable="true"/> <element name="sal" type="decimal" nillable="true"/> </sequence> </complexType> <complexType name="getEmpBySalXMLRowSetResponse"> <sequence> <element name="result" type="ns1:swaRef" nillable="true"/> </sequence> </complexType> <complexType name="getEmpBySalXMLResponse"> <sequence> <element name="result" type="xsd:any" nillable="true"/> </sequence> </complexType>
getEmpBySalXMLRowSetResponse
およびgetEmpBySalXMLResponse
の2つのメソッドはswaRef
型のパラメータを持ちます。この型に対して、アセンブラはクライアント・プロキシにjavax.xml.soap.AttachmentPart
を生成します。戻される問合せ結果にアクセスするクライアント・コードを例10-9に示します。
import oracle.jdbc.pool.OracleDataSource; import oracle.jdbc.rowset.OracleWebRowSet; import javax.xml.soap.AttachmentPart; import org.w3c.org.Element; import javax.xml.transform.dom.*; import java.io.*; ... /* Access the query result as Oracle XDB RowSet */ Element element = eme.getEmpBySalXML(new BigDecimal(500)); DOMSource doms = new javax.xml.transform.doc.DOMSource(element); buf = new jav.io.ByteArrayOutputStream(); StreamResult streamr = new StreamResult(buf); trnas.transform(doms, streamr); System.out.println(buf, toString()); /* Access the query result as Oracle WebRowSet */ ap = eme.getEmpBySalXMLRowSet(new BigDecimal(500)); source = (Source) ap.getContent(); trans = TransformerFactory.newInstance().newTransformer(); buf = new ByteArrayOutputStream(); streamr = new StreamResult(buf); trans.transform(source, streamr); InputStream istream = new ByteArrayInputStream(buf.toString().getBytes()); OracleWebRowSet rowset = new OracleWebRowSet(); System.setProperty("http.proxyHost", "www-proxy.us.oracle.com"); System.setProperty("http.proxyPort", "80"); System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "oracle.xml.jaxp.JXDocumentBuilderFactory"); rowset.readXml(new InputStreamReader(istream)); rowset.writeXml(new PrintWriter(System.out));
例10-9のコードは、問合せ結果をOracle XDB行セット(ROWSET
)およびOracle Web行セット(OracleWebRowSet
)の2つの形式で表示します。例10-10では問合せ結果をOracle XDB行セットで表示しています。例10-11では結果をWebRowSet
形式で出力しています。実際には、oracle.jdbc.rowset.OracleWebRowSet
APIを使用して、例10-9の可変行セットであるOracleWebRowSet
インスタンスにアクセスします。
<ROWSET> <ROW num="1"> <ENAME>SMITH</ENAME><SAL>800</SAL> </ROW> <ROW num="2"> <ENAME>ALLEN</ENAME><SAL>1600</SAL> </ROW> <ROW num="3"> <ENAME>WARD</ENAME><SAL>1250</SAL> </ROW> </ROWSET>例10-11 問合せ結果(JDBC Web行セット書式)
<?xml version="1.0" encoding="UTF-8"?> <webRowSet xmlns="http://java.sun.com/xml/ns/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/jdbc http://java.sun.com/xml/ns/jdbc/webrowset.xsd"> <properties> <command></command> <concurrency>1007</concurrency> <datasource></datasource> <escape-processing>true</escape-processing> <fetch-direction>1002</fetch-direction> <fetch-size>10</fetch-size> <isolation-level>2</isolation-level> <key-columns> </key-columns> <map> </map> <max-field-size>0</max-field-size> <max-rows>0</max-rows> <query-timeout>0</query-timeout> <read-only>false</read-only><rowset-type>1005</rowset-type> <show-deleted>false</show-deleted> <table-name></table-name> <url>jdbc:oracle:thin:@stacd15:1521:lsqlj1</url> <sync-provider> <sync-provider-name>com.sun.rowset.providers.RIOptimisticProvider</sync-provider-name> <sync-provider-vendor>Sun Microsystems Inc.</sync-provider-vendor> <sync-provider-version>1.0</sync-provider-version> <sync-provider-grade>2</sync-provider-grade> <data-source-lock>1</data-source-lock> </sync-provider> </properties> <metadata> <column-count>2</column-count> <column-definition> <column-index>1</column-index> <auto-increment>false</auto-increment> <case-sensitive>true</case-sensitive> <currency>false</currency> <nullable>1</nullable> <signed>true</signed> <searchable>true</searchable> <column-display-size>10</column-display-size> <column-label>ENAME</column-label> <column-name>ENAME</column-name> <schema-name></schema-name> <column-precision>0</column-precision> <column-scale>0</column-scale> <table-name></table-name> <catalog-name></catalog-name> <column-type>12</column-type> <column-type-name>VARCHAR2</column-type-name> </column-definition> <column-definition> <column-index>2</column-index> <auto-increment>false</auto-increment> <case-sensitive>true</case-sensitive> <currency>false</currency> <nullable>1</nullable> <signed>true</signed> <searchable>true</searchable> <column-display-size>10</column-display-size> <column-label>SAL</column-label> <column-name>SAL</column-name> <schema-name></schema-name> <column-precision>0</column-precision> <column-scale>0</column-scale> <table-name></table-name> <catalog-name></catalog-name> <column-type>2</column-type> <column-type-name>NUMBER</column-type-name> </column-definition> </metadata> <data> <currentRow> <columnValue>SMITH</columnValue> <columnValue>800</columnValue> </currentRow> <currentRow> <columnValue>ALLEN</columnValue> <columnValue>1600</columnValue> </currentRow> <currentRow> <columnValue>WARD</columnValue> <columnValue>1250</columnValue> </currentRow> </data> </webRowSet>
DML文はUPDATE
、DELETE
またはINSERT
SQL文です。sqlAssemble
コマンドを使用して、DML文をWebサービスの操作として公開できます。DML操作は正常終了すると自動的にコミットされ、エラーがあった場合は自動的にロールバックされます。
例10-12は、例10-7のDML文を公開するWSDLフラグメントです。
updateEmp=update emp SET sal=sal+500 where ename=:{myname VARCHAR}
このDML文は2つの操作として公開されています。この例では、updateEmp
によりDML文が実行されますが、updateEmpiS
によっても同じものがバッチ・モードで実行されます。バッチ操作では、オリジナルの各DML引数の配列を使用します。配列の各要素がバッチの1実行として使用されます。バッチ操作の結果は、バッチで更新される行の合計数になります。
<message name="SqlStmts_updateEmp"> <part name="salary" type="xsd:string"/> </message> <message name="SqlStmts_updateSchemaResponse"> <part name="result" type="xsd:int"/> </message> <message name="SqlStmts_updateEmpiS"> <part name="salary" type="tns:ArrayOfstring"/> </message> <message name="SqlStmts_updateEmpiSResponse"> <part name="result" type="xsd:int"/> </message>
Oracle Streamsアドバンスト・キューイングは、Oracleデータベースが提供する非同期メッセージング・システムです。アドバンスト・キュー(AQ)をWebサービスとして公開することにより、クライアントはメッセージをデータベース内の受信者、つまり、同じWebサービスの別のクライアントに送信できます。
WebServicesAssemblerツールは、データベース内の既存のAQからWebサービスを生成できます。AQはシングル・コンシューマまたは複数のコンシューマを持つことができます。シングル・コンシューマは、通常のいわゆるキューのことです。複数のコンシューマを持つAQは、通常のいわゆるトピックのことです。各Oracle Streams AQはキュー表に格納されています。キュー表は、格納しているすべてのAQのペイロード・タイプを定義し、AQがキューのみをサポートするか、またはトピックもサポートするのかも定義します。生成されるJavaコードでは、Oracle Streams AQ JMS APIが使用されます。
WebServicesAssemblerがキューおよびトピックに関して公開するWebサービス操作の例は、それぞれ例10-14および例10-15を参照してください。アセンブラはOracle Streams AQおよびAQ JMS APIをベースにして操作を作成します。
この項の内容は、次のとおりです。
開始する前に、次のファイルと情報を用意してください。
次の手順は、WebServicesAssemblerを使用してOracle AQキューからWebサービスをアセンブルする方法を示しています。
-aqAssemble
コマンドに入力します。 たとえば、次のコマンドはWebサービス・アプリケーションを作成し、queue.ear
ファイルを現行ディレクトリに生成します。WebServicesAssemblerツールは、実行時にキューにアクセスするJavaファイルを生成します。「サンプルのAQキュー/トピックの宣言」に、AQ sample_queue
の宣言の例を示します。
コマンドライン:
java -jar $ORACLE_HOME/webservices/lib/wsa.jar -aqAssemble -appName queue -dataSource jdbc/OracleManagedDS -portName assembleQueuePort -sql sample_queue -dbConnection jdbc:oracle:thin:@stacd15:1521:lsqlj -dbUser scott/tiger
Antタスク:
<aqAssemble appName="queue" dataSource="jdbc/OracleManagedDS" sql="sample_queue" portName="assembleQueuePort" dbConnection="jdbc:oracle:thin:@stacd15:1521:lsqlj" dbUser="scott/tiger" />
宣言内のサンプル・トピックsample_topic
は、sample_queue
と同じようにパブリッシュできます(ただし、WebServicesAssemblerの別個の起動においてです)。異なる点は、aqAssemble
コマンドのsql
引数およびappName
引数の値のみです。
このコマンドおよびAntタスクの説明:
aqAssemble
: データベースのアドバンスト・キューからWebサービスを生成します。このコマンドを使用するには、データベースに接続する必要があります。「aqAssemble」を参照してください。
appName
: アプリケーションの名前を指定します。この名前は、通常context
やuri
などの他の引数のベース値として使用されます。「appName」を参照してください。
dataSource
: 実行時にWebサービスによって使用されるデータソースのJNDI位置を指定します。「dataSource」を参照してください。
sql
: PL/SQLのパッケージ名を指定します。「sql」を参照してください。
dbConnection
: データベースのJDBC URLを指定します。「dbConnection」を参照してください。
dbUser
: user/
passwordの形式でデータベースのスキーマとパスワードを指定します。「dbUser」を参照してください。
この手順は、AQがOC4Jインスタンスのデータソースとして設定されていることを想定しています。
次のコマンドラインは、サンプルのデプロイおよびバインドのコマンドです。
% java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome -deploy -file dist/queue.ear -deploymentName queue % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome -bindWebApp queue queue-web default-web-site /queue
この例において、<J2EE_HOME
>は、J2EEのインストール・ディレクトリです。
EARファイルのデプロイの詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。
OracleAS Web Servicesでは、デプロイされたWebサービスごとにWebサービス・テスト・ページが提供されます。Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。
genProxy
コマンドを使用してWebServicesAssemblerツールを実行し、J2SE Webサービス・クライアントのスタブ(クライアント・プロキシ)を生成します。J2SE環境向けのクライアント・サイド・コードの生成およびアセンブルの詳細は、第15章「J2SE Webサービス・クライアントのアセンブル」を参照してください。
genInterface
コマンドを使用してWebServicesAssemblerツールを実行し、J2EE Webサービス・クライアント用のJAX-RPCマッピング・ファイルおよびサービス・エンドポイント・インタフェースを生成します。クライアント・サイド・コードの生成およびアセンブルの詳細は、第14章「J2EE Webサービス・クライアントのアセンブル」を参照してください。
たとえば、次のコマンドはgenProxy
を使用してJ2SEクライアントのコードを生成します。
% java -jar wsa.jar -genProxy -wsdl http://locahost:8888/queue/queue?WSDL -output build/src/client -mappingFileName ./mapping.xml -packageName oracle.demo.db.queue.stub -unwrapParameters true
このコマンドの説明:
genProxy
: J2SE Webサービス・クライアントから使用可能な静的プロキシ・スタブを作成します。「genProxy」を参照してください。
wsdl
: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。
output
: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。
mappingFileName
: JAX-RPCマッピング・ファイルを指すファイル位置を指定します。「mappingFileName」を参照してください。
packageName
: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。
unwrapParameters
: この引数はdocument-literal操作に対してのみ設定でき、その他のメッセージ書式では無視されます。unwrapParameters
をtrue
に設定すると(デフォルト)、戻り型とレスポンス・タイプがアンラップされます。通常はこの方が使いやすくなります。特にタイプが単純な場合はそうです。「unwrapParameters」を参照してください。
クライアントをコンパイルする前に、クラスパス上にある適切なJARをリストします。クライアントのクラスパスで使用可能なすべてのJARファイルのリストについては、表A-2「クライアント・サイド・プロキシを使用するクライアントのクラスパス・コンポーネント」を参照してください。個々のJARをリストするかわりに、クライアントのクラスパスにクライアント側のJARとしてwsclient_extended.jar
を含めることができます。このJARファイルには、Webサービス・クライアントをコンパイルおよび実行するために必要なすべてのクラスが含まれます。これらのクラスは、表A-2にリストされている各JARファイルに含まれているものです。wsclient_extended.jar
およびクライアントのクラスパスの詳細は、「Webサービス・プロキシのクラスパスの設定」を参照してください。
次のコマンドラインは、サンプルのコンパイルおよび実行のコマンドです。
% javac -classpath path <ORACLE_HOME>/webservices/lib/wsclient_extended.jar: :<ORACLE_HOME>/webservices/lib/jaxrpc-api.jar QueueClient.java % java -classpath path <ORACLE_HOME>/webservices/lib/wsclient_extended.jar: <ORACLE_HOME>/webservices/lib/jaxrpc-api.jar: <J2EE_HOME>/lib/jax-qname-namespace.jar: <J2EE_HOME>/lib/activation.jar:<J2EE_HOME>/lib/mail.jar: <J2EE_HOME>/lib/http_client.jar: <ORACLE_HOME>/webservices/lib/commons-logging.jar: <ORACLE_HOME>/lib/xmlparserv2.jar QueueClient
この例において、<J2EE_HOME
>はJ2EEのインストール・ディレクトリであり、<ORACLE_HOME
>はOracleAS Web Servicesのインストール・ディレクトリです。
例10-13のPL/SQLスクリプトは、キューsample_queue
およびトピックsample_topic
を定義しています。キューのペイロード・タイプはqueue_message
であり、SQLオブジェクト・タイプです。トピックのペイロード・タイプはtopic_message
であり、同様にSQLオブジェクト・タイプです。
create type scott.queue_message as object ( Subject VARCHAR2(30), Text VARCHAR2(80)); create type scott.topic_message as object ( Subject VARCHAR2(30), Text VARCHAR2(80)); BEGIN dbms_aqadm.create_queue_table ( Queue_table => 'scott.queue_queue_table', Queue_payload_type => 'scott.queue_message'); dbms_aqadm.create_queue( queue_name => 'scott.sample_queue', queue_table => 'scott.queue_queue_table' ); dbms_aqadm.start_queue(queue_name => 'scott.sample_queue'); dbms_aqadm.create_queue_table ( Queue_table => 'scott.topic_queue_table', Multiple_consumers => TRUE, Queue_payload_type => 'scott.topic_message'); dbms_aqadm.create_queue( queue_name => 'scott.sample_topic', queue_table => 'scott.topic_queue_table' ); dbms_aqadm.start_queue(queue_name => 'scott.sample_topic'); END; /
「サンプルのAQキュー/トピックの宣言」で記述されているキューに対してWebServicesAssemblerによって公開されるWebサービス操作を、例10-14にリストします。
この例では、send
操作がペイロードをキューにエンキューしています。ペイロード・タイプは、<send/>
要素に示されているように、複合型tns:QueueMessageUser
です。この型はSQL型QUEUE_MESSAGE
に対応しています。receive
操作はキューからのペイロードを戻します。<receiveResponse/>
要素は、戻されるペイロードのタイプがtns:QueueMessage
であることを示しています。メッセージがキューに追加されるまで操作はブロックされます。receiveNoWait
操作はキューからのペイロードを戻します。キューにメッセージが存在しない場合は、操作は待機せずにNULLを戻します。 receive2
操作は2つの引数を持ちます。
selector
はAQ規則で指定されているフィルタ条件です。条件を満たすメッセージのみを戻すreceive
操作が可能です。たとえば、JMSPriority < 3 AND PRICE < 300
をselectorに指定すると、優先度3以上、および属性PRICE
が300未満のメッセージのみが公開されます。パラメータnoWait
がtrue
の場合、操作はブロックされません。
<operation name="receive"> <input message="tns:SampleQueue_receive" /> <output message="tns:SampleQueue_receiveResponse" /> </operation> <operation name="receive2"> <input message="tns:SampleQueue_receive2" /> <output message="tns:SampleQueue_receive2Response" /> </operation> <operation name="receiveNoWait"> <input message="tns:SampleQueue_receiveNoWait" /> <output message="tns:SampleQueue_receiveNoWaitResponse" /> </operation> <operation name="send"> <input message="tns:SampleQueue_send" /> <output message="tns:SampleQueue_sendResponse" /> </operation> <complexType name="receive"> <sequence /> </complexType> <complexType name="receiveResponse"> <sequence> <element name="result" type="tns:QueueMessageUser" nillable="true" /> </sequence> </complexType> <complexType name="QueueMessageUser"> <sequence> <element name="text" type="string" nillable="true" /> <element name="subject" type="string" nillable="true" /> </sequence> </complexType> <complexType name="receive2"> <sequence> <element name="String_1" type="string" nillable="true" /> <element name="boolean_2" type="boolean" /> </sequence> </complexType> <complexType name="receive2Response"> <sequence> <element name="result" type="tns:QueueMessageUser" nillable="true" /> </sequence> </complexType> <complexType name="receiveNoWait"> <sequence /> </complexType> <complexType name="receiveNoWaitResponse"> <sequence> <element name="result" type="tns:QueueMessageUser" nillable="true" /> </sequence> </complexType> <complexType name="send"> <sequence> <element name="QueueMessageUser_1" type="tns:QueueMessageUser" nillable="true" /> </sequence> </complexType> <complexType name="sendResponse"> <sequence /> </complexType>
「サンプルのAQキュー/トピックの宣言」で記述されているトピックに対してWebServicesAssemblerによって公開されるWebサービス操作を、例10-15にリストします。
この例では、publish
操作によりペイロードがトピックに入力されます。引数は、例10-15で示しているように、tns:TopicMessageUser
などのペイロード・タイプです。このメッセージは、すべてのトピック・サブスクライバに受信されます。
publish2
操作は、ペイロードを受信者リストのすべてのサブスクライバに送信します。この操作は次の引数を取ります。
publish3
操作は、ペイロードをトピックにブロードキャストします。この操作は次の引数を取ります。
payload
: 送信するメッセージ。
deliveryMode
(xsd:int
型): 指定できるインタフェース値はjavax.jms.DeliveryMode.PERSISTENT
またはjavax.jms.DeliveryMode.NON_PERSISTENT
のどちらかです。ただし、このリリースではDeliveryMode.PERSISTENT
のみがサポートされます。インタフェースjavax.jms.DeliveryMode
はJMS APIのものです。
priority
(xsd:int
型): メッセージの優先度を指定します。0から9の値を指定できます。0が優先度最低、9が最高になります。
timeToLive
(xsd:long
型): メッセージの寿命をミリ秒単位で指定します。0は無制限を意味します。
receive
操作は、受信者に送信されるメッセージを戻します。この操作は1つの引数receiver
を取ります。
receiveNoWait
操作は、指定された受信者に待機なしで送信されるメッセージを戻します。
receive2
操作は、指定された受信者に送信されるフィルタ処理済メッセージを戻します。この操作は次の引数を取ります。
receive3
操作は、指定された受信者に対するフィルタ済のペイロードを戻します。この操作は次の引数を取ります。
receiver
(xsd:string
型): フィルタ処理済メッセージの受信者。
selector
(xsd:string
型): AQ規則で指定されているフィルタ条件。
timeout
(xsd:long
型): 操作のタイムアウト時間をミリ秒単位で指定します。0はタイムアウトなしを意味します。
subscribe
操作は、ユーザーをトピックにサブスクライブします。Webサービスのサポート基盤となる接続には、コンシューマをサブスクライブするために必要な権限が付与されている必要があります。権限がない場合は、この操作は無効です。
unsubscribe
操作は、ユーザーをトピックからサブスクライブ解除します。この場合も、Webサービスのサポート基盤となる接続には、コンシューマをサブスクライブ解除するために必要な権限が付与されている必要があります。権限がない場合は、この操作は無効です。
<operation name="publish"> <input message="tns:SampleTopic_publish" /> <output message="tns:SampleTopic_publishResponse" /> </operation> <operation name="publish2"> <input message="tns:SampleTopic_publish2" /> <output message="tns:SampleTopic_publish2Response" /> </operation> <operation name="publish3"> <input message="tns:SampleTopic_publish3" /> <output message="tns:SampleTopic_publish3Response" /> </operation> <operation name="receive"> <input message="tns:SampleTopic_receive" /> <output message="tns:SampleTopic_receiveResponse" /> </operation> <operation name="receive2"> <input message="tns:SampleTopic_receive2" /> <output message="tns:SampleTopic_receive2Response" /> </operation> <operation name="receive3"> <input message="tns:SampleTopic_receive3" /> <output message="tns:SampleTopic_receive3Response" /> </operation> <operation name="receiveNoWait"> <input message="tns:SampleTopic_receiveNoWait" /> <output message="tns:SampleTopic_receiveNoWaitResponse" /> </operation> <complexType name="publish"> <sequence> <element name="TopicMessageUser_1" type="tns:TopicMessageUser" nillable="true" /> </sequence> </complexType> <complexType name="TopicMessageUser"> <sequence> <element name="text" type="string" nillable="true" /> <element name="subject" type="string" nillable="true" /> </sequence> </complexType> <complexType name="publishResponse"> <sequence /> </complexType> <complexType name="publish2"> <sequence> <element name="TopicMessageUser_1" type="tns:TopicMessageUser" nillable="true" /> <element name="arrayOfString_2" type="string" nillable="true" minOccurs="0" maxOccurs="unbounded" /> </sequence> </complexType> <complexType name="publish2Response"> <sequence /> </complexType> <complexType name="publish3"> <sequence> <element name="TopicMessageUser_1" type="tns:TopicMessageUser" nillable="true" /> <element name="int_2" type="int" /> <element name="int_3" type="int" /> <element name="long_4" type="long" /> </sequence> </complexType> <complexType name="publish3Response"> <sequence /> </complexType> <complexType name="receive"> <sequence> <element name="String_1" type="string" nillable="true" /> </sequence> </complexType> <complexType name="receiveResponse"> <sequence> <element name="result" type="tns:TopicMessageUser" nillable="true" /> </sequence> </complexType> <complexType name="receive2"> <sequence> <element name="String_1" type="string" nillable="true" /> <element name="String_2" type="string" nillable="true" /> </sequence> </complexType> <complexType name="receive2Response"> <sequence> <element name="result" type="tns:TopicMessageUser" nillable="true" /> </sequence> </complexType> <complexType name="receive3"> <sequence> <element name="String_1" type="string" nillable="true" /> <element name="String_2" type="string" nillable="true" /> <element name="long_3" type="long" /> </sequence> </complexType> <complexType name="receive3Response"> <sequence> <element name="result" type="tns:TopicMessageUser" nillable="true" /> </sequence> </complexType> <complexType name="receiveNoWait"> <sequence> <element name="String_1" type="string" nillable="true" /> </sequence> </complexType> <complexType name="receiveNoWaitResponse"> <sequence> <element name="result" type="tns:TopicMessageUser" nillable="true" /> </sequence> </complexType>
例10-16は、公開されているWebサービスにアクセスするJAX-RPC Webサービス・クライアントのサンプルです。「WebServicesAssemblerで生成されるトピックに対するWebサービスのサンプル」は、キューとトピックによって公開される操作を示しています。
SampleQueuePortClient queue = new SampleQueuePortClient(); QueueMessageUser m; queue.send(new QueueMessageUser( "star chopper", "sample 1")); queue.send(new QueueMessageUser("easy blocks", "sample 2")); queue.send(new QueueMessageUser("back to future", "sample 3")); m = queue.receive(); while (m != null) { System.out.println("Message received from SampleQueue: " + m.getSubject() + ": " + m.getText()); m = queue.receiveNoWait(); }
このクライアントは次のレスポンスを戻します。
Message received from SampleQueue: sample 1: star chopper Message received from SampleQueue: sample 2: easy blocks Message received from SampleQueue: sample 3: back to future
デフォルトでは、Webサービス・インタフェース・コードはデータソースを使用してJDBC接続を取得します。次に、この接続を使用してデータベース内のキューにアクセスします。
JDBCのかわりにJMSを使用してキューにアクセスすることもできます。WebServicesAssemblerツールには、aqAssemble
コマンドに対して次のような特別な引数が用意されており、これらを使用してJMSキュー・インスタンスを使用することで、公開されるOracle AQにアクセスできます。
aqAssemble
コマンドでdataSource
引数を指定するかわりに、前述のパラメータのいずれかを指定できます。Webサービスの実行時に、JMSキューがJDBCベースのキューのかわりに使用されます。
dbJavaAssemble
コマンドを使用して、Oracleデータベース内のJava VMのJavaクラスを起動するWebサービスを生成します。Webサービス操作として公開できるのは、静的メソッドまたはインスタンス・メソッドです。インスタンス・メソッドは、セッションのデフォルト・インスタンスまたはシングルトン・インスタンスを介して起動できます。
公開するJavaクラスには、次のパラメータ型および戻り型を指定できます。
char
を除く)
java.io.Serializable
を実装するクラス)
oracle.sql.*
型
この項の内容は、次のとおりです。
開始する前に、次の情報を用意してください。
次の手順は、WebServicesAssemblerを使用してサーバー・サイドJavaクラスからWebサービスをアセンブルする方法を示しています。
dbJavaAssemble
コマンドに入力します。 例を示します。次のdbJavaAssemble
コマンドでは、サーバー・サイド・クラスoracle.sqlj.checker.JdbcVersion
はSQLJサーバー・サイド・トランスレータに含まれています。このコマンドは、クラスjavacallin.ear
に対するWebサービス・アプリケーションをアセンブルします。また、PL/SQLラッパーおよびJavaストアド・プロシージャのラッパーも生成します。Javaストアド・プロシージャのラッパーの目的は、サーバー・サイドJavaクラスのシグネチャ型を、PL/SQLストアド・プロシージャに公開できる型に変換することです。sysUser
引数が宣言されているため、WebServicesAssemblerにより、生成されたラッパーはデータベースに自動的にロードされます。
コマンドライン:
java -jar wsa.jar -dbJavaAssemble -appName javacallin -dbJavaClassName oracle.sqlj.checker.JdbcVersion -dbConnection jdbc:oracle:thin:@stacd15:1521:lsqlj -dataSource jdbc/OracleManagedDS -dbUser scott/tiger -sysUser sys/knl_test7
Antタスク:
<oracle:dbJavaAssemble appName="javacallin" dbJavaClassName="oracle.sqlj.checker.JdbcVersion" dbConnection="jdbc:oracle:thin:@stacd15:1521:lsqlj" dataSource="jdbc/OracleManagedDS" dbUser="scott/tiger" sysUser="sys/knl_test7" />
このコマンドおよびAntタスクの説明:
dbJavaAssemble
: OracleデータベースにあるJava VMのJavaクラスからWebサービスを生成します。このコマンドを使用するには、データベースに接続する必要があります。「dbJavaAssemble」を参照してください。
appName
: アプリケーションの名前を指定します。この名前は、通常context
やuri
などの他の引数のベース値として使用されます。「appName」を参照してください。
dbJavaClassName
: Webサービスとして公開するサーバー・サイドJavaクラスの名前を指定します。「dbJavaClassName」を参照してください。
dbConnection
: データベースのJDBC URLを指定します。「dbConnection」を参照してください。
dataSource
: 実行時にWebサービスによって使用されるデータソースのJNDI位置を指定します。「dataSource」を参照してください。
dbUser
: user/
passwordの形式でデータベースのスキーマとパスワードを指定します。「dbUser」を参照してください。
sysUser
: SYS
権限のあるユーザーの名前とパスワードを、dbSysUser/syspassword
の形式で指定します。この引数を使用すると、コード生成時にPL/SQLおよびJavaラッパー・コードがデータベースに自動的にインストールされます。「sysUser」を参照してください。
実行時には、WebサービスのコードがJDBCを使用してPL/SQLラッパーを起動し、ここからJavaストアド・プロシージャ・ラッパーが起動され、さらに最終的に当該のサーバー・サイド・クラスが起動されます。例10-18に、このコマンドで生成されるWebサービス操作をいくつか示します。
このステップは、ステップ1に指定されているデータソースがOC4Jのインスタンスにインストールされていることを前提にしています。
次のコマンドラインは、サンプルのデプロイおよびバインドのコマンドです。
% java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome -deploy -file dist/javacallin.ear -deploymentName javacallin % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome -bindWebApp javacallin javacallin-web default-web-site /javacallin
この例において、<J2EE_HOME
>は、J2EEのインストール・ディレクトリです。
EARファイルのデプロイの詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。
OracleAS Web Servicesでは、デプロイされたWebサービスごとにWebサービス・テスト・ページが提供されます。Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。
genProxy
コマンドを使用してWebServicesAssemblerツールを実行し、J2SE Webサービス・クライアントのスタブ(クライアント・プロキシ)を生成します。J2SE環境向けのクライアント・サイド・コードの生成およびアセンブルの詳細は、第15章「J2SE Webサービス・クライアントのアセンブル」を参照してください。
genInterface
コマンドを使用してWebServicesAssemblerツールを実行し、J2EE Webサービス・クライアント用のJAX-RPCマッピング・ファイルおよびサービス・エンドポイント・インタフェースを生成します。クライアント・サイド・コードの生成およびアセンブルの詳細は、第14章「J2EE Webサービス・クライアントのアセンブル」を参照してください。
たとえば、次のコマンドはgenProxy
を使用してJ2SEクライアントのコードを生成します。
% java -jar wsa.jar -genProxy -wsdl http://locahost:8888/javacallin/javacallin?WSDL -output build/src/client -mappingFileName ./mapping.xml -packageName oracle.demo.db.queue.stub -unwrapParameters true
このコマンドの説明:
genProxy
: J2SE Webサービス・クライアントから使用可能な静的プロキシ・スタブを作成します。「genProxy」を参照してください。
wsdl
: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。
output
: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。
mappingFileName
: JAX-RPCマッピング・ファイルを指すファイル位置を指定します。「mappingFileName」を参照してください。
packageName
: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。
unwrapParameters
: この引数はdocument-literal操作に対してのみ設定でき、その他のメッセージ書式では無視されます。unwrapParameters
をtrue
に設定すると(デフォルト)、戻り型とレスポンス・タイプがアンラップされます。通常はこの方が使いやすくなります。特にタイプが単純な場合はそうです。「unwrapParameters」を参照してください。
クライアントをコンパイルする前に、クラスパス上にある適切なJARをリストします。クライアントのクラスパスで使用可能なすべてのJARファイルのリストについては、表A-2「クライアント・サイド・プロキシを使用するクライアントのクラスパス・コンポーネント」を参照してください。個々のJARをリストするかわりに、クライアントのクラスパスにクライアント側のJARとしてwsclient_extended.jar
を含めることができます。このJARファイルには、Webサービス・クライアントをコンパイルおよび実行するために必要なすべてのクラスが含まれます。これらのクラスは、表A-2にリストされている各JARファイルに含まれているものです。wsclient_extended.jar
およびクライアントのクラスパスの詳細は、「Webサービス・プロキシのクラスパスの設定」を参照してください。
次のコマンドラインは、サンプルのコンパイルおよび実行のコマンドです。
% javac -classpath path <ORACLE_HOME>/webservices/lib/wsclient_extended.jar: :<ORACLE_HOME>/webservices/lib/jaxrpc-api.jar JavacallinClient.java % java -classpath path <ORACLE_HOME>/webservices/lib/wsclient_extended.jar: <ORACLE_HOME>/webservices/lib/jaxrpc-api.jar: <J2EE_HOME>/lib/jax-qname-namespace.jar: <J2EE_HOME>/lib/activation.jar:<J2EE_HOME>/lib/mail.jar: <J2EE_HOME>/lib/http_client.jar: <ORACLE_HOME>/webservices/lib/commons-logging.jar: <ORACLE_HOME>/lib/xmlparserv2.jar JavacallinClient
この例において、<J2EE_HOME
>はJ2EEのインストール・ディレクトリであり、<ORACLE_HOME
>はOC4Jのインストール・ディレクトリです。
例10-17には、Oracle9iおよび10gデータベースとともに配布されているサーバー・サイドJavaクラスoracle.sqlj.checker.JdbcVersion
の2つのAPIが示されています。dbJavaAssemble
コマンドはこれらのAPIをWebサービスとして公開します。
public class oracle.sqlj.checker.JdbcVersion extends java.lang.Object { public static int getDriverMajorVersion(); public static int getDriverMinorVersion(); ... }
例10-18のWSDLフラグメントは、例10-17のJdbcVersion
APIのgetDriverMajorVersion
およびgetDriverMinorVersion
に対して生成されたWebサービス操作です。
<complexType name="getDriverMajorVersion"> <sequence /> </complexType> <complexType name="getDriverMajorVersionResponse"> <sequence> <element name="result" type="decimal" nillable="true" /> </sequence> </complexType> <complexType name="getDriverMinorVersion"> <sequence /> </complexType> <complexType name="getDriverMinorVersionResponse"> <sequence> <element name="result" type="decimal" nillable="true" /> </sequence> </complexType> <portType name="JdbcVersion"> <operation name="getDriverMajorVersion"> <input message="tns:JdbcVersion_getDriverMajorVersion" /> <output message="tns:JdbcVersion_getDriverMajorVersionResponse" /> </operation> <operation name="getDriverMinorVersion"> <input message="tns:JdbcVersion_getDriverMinorVersion" /> <output message="tns:JdbcVersion_getDriverMinorVersionResponse" /> </operation> </portType>
この項の内容は、次のとおりです。
Oracle JPublisherは、PL/SQLおよびJava Webサービスのコールアウトを、必要なスタブ・コードの作成によってサポートしています。これにより、データベース内でPL/SQLまたはJavaを使用してWebサービス・クライアントを起動できるようになります。Webサービスのコールアウト用に、WSDLのファイルすなわち位置をOracle JPublisherに指定します。Oracle JPublisherにより、PL/SQLラッパー、およびPL/SQLラッパーを実装する必要なデータベース・サーバー・サイドJavaクラスが生成されます。生成されるPL/SQLラッパーには、各Webサービス操作用のPL/SQLプロシージャまたはファンクションが格納されます。
オプションとして、Oracle JPublisherには、Javaクライアント・プロキシのみを生成する機能もあります。これらのJavaクライアント・プロキシは、データベースのJavaコードによるWebサービスのコールアウトに使用できます。
図10-3に、Oracle JPublisherが生成可能なスタブ・コードを示します。
Oracle JPublisherが生成するクライアント・プロキシは、OracleAS Web Services 10.1.3のJavaプロキシに対して生成される、単純化されたクライアント・コードをベースにしています。したがって、Oracle JPublisherが生成するJavaおよびPL/SQLクライアントはOracleAS Web Services 10.1.3.1によって完全にサポートされます。さらに、Oracle JPublisherは、OracleAS Web Services 9.0.4スタイルのWebサービス・クライアントも生成できます。
Webサービスのコールアウトには、これらのユーティリティおよびツールが必要です。
指示に従って、JARおよびSQLファイルをデータベースにロードします。これらのユーティリティはOracle Database Web ServicesのWebサイトから入手可能です。
http://www.oracle.com/technology/tech/webservices/database.html
Oracle JPublisherをインストールしていない場合は、JDBC、SQLJおよびOracle JPublisherのダウンロードWebサイトから入手できます。
http://www.oracle.com/technology/tech/java/java_db/index.html
Oracle JPublisherのこれらのオプションは、Webサービスのコールアウトには必須です。
これらはOracle JPublisherのオプション・パラメータです。
httpproxy
: WSDLファイルにアクセスするためのHTTPプロキシ・ホストおよびポート
sysuser
: SYSDBA権限を持つデータベース・ユーザー(およびパスワード)
proxyopts
: proxywsdl
固有のオプションのリスト
dir
: 生成されたすべてのファイルが格納されるディレクトリ
sysUser
引数を使用することで、Oracle JPublisherが生成済ファイルをデータベースにロードできるようになります。この引数が宣言されていない場合は、PL/SQLからWebサービスを起動するために、生成済ファイルを手動でデータベースにロードする必要があります。
Webサービス・コールアウト・ユーティリティを使用すると、クライアントはデータベースからWebサービスにアクセスできます。Webサービス・コールアウトは、データベース内のPL/SQLクライアント、SQL文およびJavaで使用できます。このユーティリティは、Oracle JPublisher 10gリリース2(10.2)およびOracleAS Web Services 10gリリース3(10.1.3.1)が基になっています。
ターゲットがOracle Database 10g(リリース10.1または10.2)か、Oracle Database 10gより前かによって、2つのバージョンのユーティリティを使用できます。
コールアウト・ユーティリティは、次のWebサイトの「Database as Web Services consumer: Calling-out external Web services」から入手できます。
http://www.oracle.com/technology/sample_code/tech/java/jsp/dbwebservices.html
次の各項では、データベース内のクライアントがWebサービス・コールアウトを実行する方法について説明します。
Oracle JPublisherのコマンドライン・オプション-proxywsdl
を使用すると、WebサービスのWSDLファイルからデータベース・サイドのJavaラッパーおよびPL/SQLラッパーを生成できます。JPublisherがWebサービス・クライアント用のラッパーを生成してデータベースにロードするには、dbwsa.jar
ファイルとdbwsclient.jar
ファイルが、それぞれ、クラスパス内およびデータベース内部に存在している必要があります。
次の手順に従って、Oracle JPublisherがサポートするWebサービス・コールアウト用の環境とデータベースを設定します。この手順は、1回のみ実行する必要があります。
Oracle JPublisherのリリースは、次のWebサイトから入手できます。
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
dbwsa.jar
を、ディレクトリORACLE_HOME¥sqlj¥lib
(Windowsの場合)またはORACLE_HOME/sqlj/lib
(Solarisの場合)に追加します。
JDKのバージョンは、ターゲット・データベースのJava VMと同じである必要があります。
dbwsa.jar
ファイルを、クラスパス環境変数に追加します。
SYS
スキーマ、またはWebサービス・クライアントが起動されたスキーマに、dbwsclient.jar
ファイルをロードします。 たとえば、次のloadjava
コマンドは、dbwsclient.jar
ファイルをSYS
スキーマにロードします。
%loadjava -u sys/change_on_install -r -v -f -s -grant public -noverify -genmissing dbwsclient.jar
次のloadjava
コマンドは、dbwsclient.jar
ファイルを特定のスキーマにロードする方法を示しています。
% loadjava -u scott/tiger -r -v -f -noverify -genmissing dbwsclient.jar
次の例は、Webサービス・クライアント用のJavaラッパーおよびPL/SQLラッパーを生成し、SQL文を使用してそれを起動する方法を示しています。この例では、次の一般的な手順に従います。
これを行うためのOracle JPublisherコマンドは、必須の-proxywsdl
オプションと-user
オプションを含みます。また、オプションの-endpoint
、-httpproxy
、-sysuser
、-dir
および-proxyopts
の各オプションを含む場合もあります。次に例を示します。
% jpub -user=username/password -sysuser=superuser_name/superuser_password -proxywsdl=WSDL_URL -endpoint=Web_services_endpoint
Webサービスがすでにhttp://localhost:8888/javacallout/javacallout
にデプロイされているものとします。
次のコマンドは、Webサービス・クライアントおよびそのJavaラッパーとPL/SQLラッパーをサブディレクトリtmp
に作成した後、データベースにラッパーをロードします。
% jpub -user scott/tiger -sysuser sys/change_on_install -proxywsdl=sample/javacallout.wsdl -endpoint=http://localhost:8888/javacallout/javacallout -dir=tmp
このコマンドは次の出力を生成します。
tmp/HelloServiceEJBJPub.java tmp/plsql_wrapper.sql tmp/plsql_dropper.sql tmp/plsql_grant.sql tmp/plsql_revoke.sql Executing tmp/plsql_dropper.sql Executing tmp/plsql_wrapper.sql Executing tmp/plsql_grant.sql Loading tmp/plsql_proxy.jar
tmp/plsql_wrapper.sql
で提供されているPL/SQLファンクションを起動できます。各PL/SQLファンクションは、Webサービスの操作に対応しています。たとえば、次のエンドポイントでWebサービスを利用できるものとします。
http://localhost:8888/javacallout/javacallout
この場合は、次のSQLコマンドを発行できます。
SQL> select jpub_plsql_wrapper.sayhello('hello') from dual;
コマンドは次の出力を戻します。
JPUB_PLSQL_WRAPPER.SAYHELLO('HELLO') ----------------------------------- HELLO!! You just said :hello
Oracle JPublisherのコールアウト・サポートの詳細は、『Oracle Database JPublisherユーザーズ・ガイド』のDynamic Invocation InterfaceとSYS.UTL_DBWSユーティリティを使用したWebサービス・コールアウトに関する項を参照してください。この資料は、次のWebサイトから入手できます。
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
PL/SQLユーザーは、PL/SQLのパッケージSYS.UTL_DBWS
を使用してWebサービスを起動できます。このパッケージでは、JAX-RPC Dynamic Invocation Interface(DII)API用のラッパー・ファンクションが提供されています。
次の手順は、Oracle Database 10gリリース1以降に適用されます。この手順では、SYS.UTL_DBWS
を使用するWebサービス・コールアウト用にデータベースを設定し、ダウンロードで提供される最新の機能でユーティリティを更新します。
dbwsclient.jar
ファイルをデータベースにロードします。
SYS
としてSQLスクリプトutl_dbws_decl.sql
およびutl_dbws_body.sql
を実行します。SYS.UTL_DBWS
を使用してWebサービスをコールできるようになります。
コールアウト・ユーティリティのダウンロードには、SQLスクリプトsamples/test-plsql-dii.sql
およびsamples/test-plsql-dii2.sql
が含まれます。どちらのスクリプトも、javacallout.wsdl
で定義されているsayHello
操作を起動します。2つのスクリプトでWSDLファイルとの通信を調べてください。どちらのスクリプトも、次の出力を生成します。PL/SQL DII client return
という文章は、クライアント・コードによって生成されます。
PL/SQL DII client return HELLO!! You just said :hello
SYS.UTL_DBWS
ユーティリティの詳細は、次のWebサイトから入手できる『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
http://www.oracle.com/technology/documentation/database10g.html
Oracle JDeveloperを使用すると、Oracleデータベースに保存されているPL/SQLパッケージのプログラム・ユニットをベースにして、Webサービスを作成できます。Oracle JDeveloperの各ウィザードを使用すると、次のタスクを実行できます。
Oracle JDeveloperを使用してPL/SQLパッケージ・ユニットを作成し、Webサービスとして公開する方法の詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。
「データベース・リソースからのWebサービスの開発」を参照してください。
詳細は、次を参照してください。
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|