この章では、Oracle SOA Suiteに関連する実行時および一般的な機能の問題について説明します。内容は次のとおりです。
この項では、一般的な問題および回避方法について説明します。内容は次のとおりです。
20.1.1項「Oracle Enterprise Manager Fusion Middleware Controlコンソールでアダプタにポリシーをアタッチできない」
20.1.2項「BPELプロセスおよびOracle Mediatorパートナ・リンクはSOAコンポジット・エディタで明示的にワイヤする必要がある」
20.1.3項「アプリケーション・アーティファクトをソース・コントロール・システムに格納し、antユーティリティでデプロイ」
20.1.6項「2つ目のコンポジットの監査レベルが「オフ」に設定されている場合、コンポジットからコンポジットへのコールが失敗する」
20.1.28項「SOAコンポジットのデプロイ、SOAコンポジットのアンデプロイ、SOAコンポジットの再デプロイのウィザードでのSSO資格証明の指定」
20.1.30項「リタイア済コンポジットがアクティブ化されている場合、SOAインフラストラクチャの再起動でエンドポイントがアクティブ化されない」
20.1.31項「SOAコンポジット・アプリケーション・インスタンスとサービス・コンポーネント・インスタンスの数の不一致」
20.1.32項「一部の監査追跡設定でフォルトが発生したインスタンスの状態が管理者操作に変更されると、Nullポインタ例外が発生」
Oracle Enterprise Manager Fusion Middleware Controlコンソールで、SOAコンポジットに含まれるアダプタにセキュリティ・ポリシーをアタッチできません。これは所定の動作です。たとえば、次の手順を実行します。
「SOAインフラストラクチャ」メニューから、テクノロジ・アダプタ(ファイル・アダプタなど)を使用するSOAコンポジット・アプリケーションを選択します。
「サービスと参照」セクションで、アダプタを選択します。
「ポリシー」タブを選択します。
次のメッセージが表示されることに注意してください。
policies can be attached to web service bindings and soa components
Oracle BPELデザイナで、BPELプロセスにOracle MediatorまたはBPELプロセス・パートナ・リンクを追加し、起動アクティビティを介していずれかのパートナ・リンクをBPELプロセスに接続した場合、SOAコンポジット・エディタでワイヤリングが自動的に反映されません。SOAコンポジット・エディタでOracle MediatorまたはBPELプロセス・サービス・コンポーネントをBPELプロセスに再度明示的にワイヤする必要があります。
ベスト・プラクティスとして、Oracle BPELデザイナではなく、常にSOAコンポジット・エディタでOracle MediatorまたはBPELプロセス・サービス・コンポーネントを作成およびワイヤします。
これは、Oracle BPELデザイナでのヒューマン・タスクまたはビジネス・ルール・パートナ・リンクでは問題ないことに注意してください。両方ともSOAコンポジット・エディタで自動的にワイヤされます。
アプリケーション・アーティファクトをソース・コントロール・システムに格納し、ant
を使用したデプロイに後で再利用する場合、アプリケーションにメタデータ・サービス(MDS)ベースの参照があるときは次の変更が必要です。
元のOracle JDeveloperアプリケーションに、次のようなファイル・ベースのMDS参照があるとします。
<metadata-store-usage id="mstore-usage_1"> <metadata-store class-name="oracle.mds.persistence.stores.file.FileMetadataStore"> <property value="${oracle.home}/integration" name="metadata-path"/> <property value="seed" name="partition-name"/> </metadata-store>
次に示すようにApplication_Directory
/.adf/META-INF/
adf-config.xml
ファイルでこのコードをデータベース・ベースのMDS参照に変更します。
<metadata-store-usage id="mstore-usage_1"> <metadata-store class-name="oracle.mds.persistence.stores.db.DBMetadataStore"> <property name="jdbc-userid" value="${mdsuser}"/> <property name="jdbc-password" value="${mdspassword}"/> <property name="jdbc-url" value="jdbc:oracle:thin:@${db.host.name}:${db.host.port}:${db.sid}"/> <property name="partition-name" value="soa-infra"/> </metadata-store>
これらのadf-config.xml
エントリで変更されたアプリケーションをソース・コントロール・システムにチェックインします。次に、変更されたadf-config.xml
の具体的な例を示します。
<metadata-store-usage id="mstore-usage_1"> <metadata-store class-name="oracle.mds.persistence.stores.db.DBMetadataStore"> <property name="jdbc-userid" value="soainfra_mds"/> <property name="jdbc-password" value="soainfra_mds"/> <property name="jdbc-url" value="jdbc:oracle:thin:@myhost56.us.oracle.com:15739:db2825"/> <property name="partition-name" value="soa-infra"/> </metadata-store>
ユーザーIDとパスワードに変数を使用し、ant
デプロイの前にアプリケーションで値を置換できます。
MDSデータベースにJNDI名がある場合、adf-config.xml
で次のエントリを使用します。
<metadata-store class-name="oracle.mds.persistence.stores.db.DBMetadataStore"> <property name="jndi-datasource" value="${db.jndi.name}"/> <property name="partition-name" value="soa-infra"/> </metadata-store>
「ツール」→「プリファレンス」→「XSLマップ」と選択した場合、拡張の深さレベルがデフォルトで6
に設定されることに注意してください。ただし、非再帰的スキーマを自動マッピングする場合、拡張の深さレベルは、実際は6 - 2 = 4
です。
ツリーにルート要素としてソースを含めているとみなしている場合でも、深さのレベルは-1
です(6 - 1 = 5
)。
ベスト・プラクティスとして、常に次の方法のいずれか(両方ではない)を使用して管理対象サーバーを起動および停止することをお薦めします。管理対象サーバーをコマンドラインから起動し、Oracle Enterprise Manager Fusion Middleware Controlコンソールから停止する、あるいはその逆などこれらの方法を混合しないでください。
Oracle Enterprise Manager Fusion Middleware Controlコンソール
この方法では、ノード・マネージャが起動し、稼働している必要があります。ノード・マネージャでは、Oracle Enterprise Manager Fusion Middleware Controlコンソールから実行されたすべての管理サーバーの起動と停止が追跡されます。この方法では、サーバーの状態は問題ではありません。
コマンドライン
この方法では、ノード・マネージャでサーバーの状態は追跡されません。このため、サーバーをコマンドラインから起動し、Oracle Enterprise Manager Fusion Middleware Controlコンソールから停止した場合、Oracle WebLogic管理サーバーは状態を判断するためにノード・マネージャにアクセスします。ノード・マネージャは不明状態を返します。
Oracle Enterprise Manager Fusion Middleware Controlコンソールからサーバーを停止および起動するには、次の手順を実行します。
WebLogicドメインを展開します。
管理対象サーバー(soa_server1という名前など)を選択します。
「コントロール」→「停止」と選択します。
「コントロール」→「起動」と選択します。
コマンドラインからのサーバーの起動および停止の詳細は、『Oracle Fusion Middleware Oracle SOA Suiteインストレーション・ガイド』を参照してください。
次のシナリオでsql.BatchUpdateException
になり、インスタンスが失敗することがあります。
SOAコンポジット・アプリケーションAがSOAコンポジット・アプリケーションBをコールします。
両コンポジットとも同じSOAインフラストラクチャにあります。
コンポジットBの監査レベルは「オフ」に設定されています。
回避方法として、Oracle Enterprise Manager Fusion Middleware ControlコンソールでコンポジットBの監査レベルを「本番」、「開発」、「継承」、「最小」などの別の値に設定します。
BPELプロセス・サービス・コンポーネントに、Oracle Web Service Manager(OWSM)フォルト、システム・フォルト、スキーマ検証フォルト、JTAフォルトなどのフォルト処理機能を明示的に追加し、これらとこれに関連するBPELインスタンスをデータベースにコミットする必要があります。次に例を示します。
<faultHandlers> <catch faultName="bpelx:owsmPolicyFault"> <invoke name="ReplyOnFault" inputVariable="output" partnerLink="client" portType="tns:FlowCallback" operation="onResult"/> </catch> </faultHandlers>
この機能を追加しないと、これらのフォルトは処理されません。これによって、トランザクション全体がロールバックされ、これらのフォルトはデータベースに残りません。後続の問合せでこれらのフォルトは示されません。
BPELプロセスはグローバル・トランザクションで実行されますが、アダプタなどの他のOracle SOA Suiteコンポーネントはローカル・トランザクションで実行されます。これによって、Oracle Enterprise Manager Fusion Middleware Controlで表示される情報に矛盾が生じることがあります。
たとえば、非同期BPELプロセスを起動するメインの同期BEPLプロセスがあるとします。非同期BPELプロセスの起動前に、メイン同期BPELプロセスでデータベース・アダプタ挿入が1つあります。非同期BPELプロセスで2番目のデータベース・アダプタ挿入があり、この時点でフォルトが発生すると想定します。
想定される動作は次のとおりです。
データベースへの最初の挿入はメイン・プロセスから実行され、想定どおり正常に完了します。
2番目の挿入も非同期プロセスで実行されますが、フォルトの発生後BPELプロセスで最初の挿入をロールバックします。
しかし、Oracle Enterprise Manager Fusion Middleware Controlコンソールで、2番目のデータベース挿入も(フォルトではなく)正常に完了したと表示されます。
これは、データベース・アダプタの起動が、グローバルBPEL JTAトランザクションに含まれないローカル・トランザクションで記録(インスタンスの追跡)されるためです。このため、データベース・アダプタの起動は正常に完了しますが、後続のBPELプロセスでグローバル・ロールバックが行われます。
<invoke name="Invoke_1" inputVariable="Invoke_1_insert_InputVariable" partnerLink="db" portType="ns1:db_ptt" operation="insert"/> . . . . . . <throw name="Throw_2" faultName="bpelx:rollback"/>
この時点で、インスタンス・トラッキングはすでにアウトバウンド起動を(ローカル・トランザクションで)成功と記録しています。アダプタが例外をスローすると、インスタンス・トラッキングはこれをフォルトと記録します。一部のパートナ・リンクはファイル・アダプタを起動し、BPELプロセスが後でbpelx:rollback
をスローしてもファイル・アダプタがロールバックされないことに注意してください。
Oracle Enterprise Manager Fusion Middleware Controlコンソールの「SOAインフラストラクチャの共通プロパティ」ページで「サーバー・データ・ソースJNDI」 と「サーバー・トランザクション・データ・ソースJNDI」の説明が入れ替わっています。ただし、「構成」リンクは正しく機能します。
Internet Explorer 7を使用して、Oracle Enterprise Manager Fusion Middleware Controlコンソールの「監査証跡」ページで「XML文書の表示」リンクをクリックすると、データが表示されません。かわりに、ページを保存するか開くよう要求されます。ファイルを開くことを選択すると、データが表示されず、再度ページを保存するか開くよう要求されます。かわりに、XMLドキュメントを保存し、テキスト・エディタで別途表示する必要があります。
回避方法として、「XML文書の表示」リンクをクリックしてデータを直接表示するには、Mozilla FireFoxを使用します。
Mozilla FireFoxを使用して、Oracle Enterprise Manager Fusion Middleware ControlコンソールでBPELプロセス・サービス・コンポーネント・インスタンスの「フロー」タブのアクティビティをクリックすると、ポップアップ・ウィンドウでXMLコンテンツの右側が切れて表示されます。右に移動してすべてのXMLコンテンツを表示するには、このウィンドウの下部のスクロール・バーを使用する必要があります。Internet Explorerを使用する場合、この問題は起こりません。
Mozilla Firefoxを使用して、Oracle Enterprise Manager Fusion Middleware Controlコンソールの「監査証跡」ページで「XML文書の表示」リンクをクリックすると、次のようなエラー・メッセージが表示されます。
XML Parsing Error: XML or text declaration not at start of entity Location: http://myhost.us.oracle.com:7001/em/faces/ai/sca/share/audit/xmlAuditDetail. jsp?detailId=0&_afrLoop=10355217141136524&_afrWindowMode=0&_afrWindowId=_new Line Number 1, Column 39:<?xml version="1.0" encoding="UTF-8"?><?xml version = '1.0' encoding = 'UTF-8'?>
このエラーは、XMLソースにXML宣言(<?xml
version
=
'1.0
'
encoding
=
'UTF-8'?>
など)がすでに含まれている場合に起こります。
<?xml version = '1.0' encoding = 'UTF-8'?>
<task xmlns="http://xmlns.oracle.com/bpel/workflow/task">
<title>Approve Discount</title>
<payload xmlns="http://xmlns.oracle.com/bpel/workflow/task">
<discountandshipping
xmlns:discountandshipping="http://www.globalcompany.com/ns/OrderBooking/rules"
xmlns="http://www.globalcompany.com/ns/OrderBooking/rules">
<price>5000.0</price>
. . . . .
. . . . .
</task>
処理時、Oracle Enterprise Manager Fusion Middleware Controlコンソールで2つ目のXML宣言が追加されます。これによってXML宣言が重複し、Mozilla Firefoxでエラーがレポートされます。
回避方法として、Internet Explorerを使用します。
Oracle WebCacheでドメインを作成し、Oracle SOA Suiteで拡張します。
WebLogic Scripting Tool(WLST)を使用してOracle Internet DirectoryでOracle WebCacheアプリケーションとLDAPを関連付け、ユーザー(ユーザー名test
など)に管理ロールを付与します。
同じロール(管理ロール)を同じユーザー(test
)に再度付与します。
次のようなWLSTエラー・メッセージが表示されるはずです。
This particular user already has admin role to access your application
かわりに次のメッセージが表示されますが、これは正しくありません。
Command FAILED, Reason: Cannot add principal to application role
XSLファイルからのXML表現は、変換が実行されてメッセージが受け渡されるシナリオまたは割当てアクティビティが使用されるシナリオで使用されるものとは、構文上およびセマンティクス上同じXMLであっても、異なることがあります。たとえば、メディエータ・サービス・コンポーネントを使用して、ネームスペースのない要素を含むインバウンド・ペイロードをアウトバウンド・ペイロードにマップすると、出力メッセージに空のネームスペース・タグが出力されることがあります。
<Country xmlns="">US</Country>
これは正しい動作です。空のネームスペースxmlns=""
は自動的に追加されます。
フォルトからのリカバリを試行し、リカバリが成功せずに最大再試行回数に達すると、リカバリ不能なフォルトになります。ただし、Oracle Enterprise Manager Fusion Middleware ControlコンソールのSOAコンポジット・アプリケーションの「ダッシュボード」タブの「コンポーネント・メトリック」セクションで、リカバリ不能な数ではなくリカバリ可能な数が増分されます。
非同期BPELプロセスで任意の根元的例外エラーによってトランザクション・ロールバック・シナリオが起こると、最後のデハイドレーション・アクティビティまでロールバックされます。これが新規インスタンスで、受信アクティビティが最初のデハイドレーション・アクティビティであった場合、BPELプロセス・サービス・エンジンでリカバリ可能な起動が作成されます。Oracle Enterprise Manager Fusion Middleware ControlコンソールでBPELプロセス・サービス・エンジンの「リカバリ」タブの「リカバリ」をクリックして起動をリカバリすると、サービス・エンジンで新規インスタンスが作成されます。このインスタンスは、例外エラーが起きずに完了します。しかし、古いインスタンスはフォルトと表示され続けます。
メッセージがリカバリ用に発行されると、BPELプロセス・サービス・エンジンでアクションの完了に時間がかかることがあります。これは、通常数秒以下です。この間、メッセージは「リカバリ」ページに表示されたままになります。その間同じメッセージのリカバリを重複して試行すると、サーバーで無視されます。最新のリカバリ・ステータスを表示するには、数秒ごとにページをリフレッシュします。
フォルトが発生したインスタンスを終了すると、Oracle Enterprise Manager Fusion Middleware Controlコンソールでステータスが正しく表示されます。ただし、例外エラーがSOAインフラストラクチャ側に表示されることがあります。
The action "abort" cannot be performed on the instance "11106" because of its current state ("closed.faulted")
このメッセージは無視できます。例外は、SOAインフラストラクチャのログsoa_server1.out
/soa-diagnostic
に出力されます。
SOAPメディエータ・メッセージの正規化メッセージへの変換の制限により、SOAP <body>
要素のwsu:Id
属性はSOAPアウトバウンド・エンドポイントに渡されません。
ヒューマン・ワークフロー・サービス・コンポーネントを含むSOAコンポジット・アプリケーションをOracle Enterprise Manager Fusion Middleware Controlコンソールからデプロイすると、次のエラー・メッセージが表示されることがあります。
oracle.fabric.common.FabricDeploymentException: oracle.fabric.common.FabricException: Deployment Failed: Unable to find a WSDL that has a definition for service
回避方法として、次のWebLogic Scripting Tool(WLST)コマンドを使用し、メタデータ・アーカイブ(MAR)デプロイを有効にします。
メタデータ・サービス(MDS)リポジトリ内のメタデータ・ラベルのリストを取得します。
listMetadataLabels(application='application_name',server='server_name')
返されたリストにpreDeployLabel
number
という名前のラベルが含まれているかどうかチェックします。
そうである場合、次のコマンドを使用してラベルを削除します。
deleteMetadataLabel(application='application_name',server='server_name',name='predeployed_label_number')
ここでは次のようになります。
application_name
はsoa-infra
です。
server_name
管理対象サーバーの名前です。デフォルト値はsoa_server1
で、これはOracle SOA Suiteのインストールおよび構成時に変更されている可能性があることに注意してください。
predeployed_label_number
はステップ2で識別したラベルです。
管理対象サーバー(soa_server1
など)を再起動します。
Oracle JDeveloperはLinuxなどのUTF-8ネイティブ・エンコーディングのオペレーティング・システムで実行することをお薦めします。そうではなく(Oracle JDeveloperをWindowsで実行するなど)、コンテンツをXML形式で保存する必要がある場合、XMLでの保存に「別名保存」を選択しないでください。
たとえば、インバウンド・メッセージの開始またはアウトバウンド・メッセージのエミュレートのテスト・ケースのコンテンツの定義時、サンプル・メッセージを生成し、「別名保存」を選択してメッセージをXMLファイルとして保存します。ファイルを使用してメッセージをロードできます。XMLファイルは、Oracle JDeveloperオペレーティング・システム・ネイティブ・エンコーディングで保存されています。しかし、実行時、XMLファイルはUTF-8エンコーディングと想定されており、読取り不可能なペイロード・データが作成されます。
回避方法として、テスト・ケース自体でサンプル・メッセージを保存します。
「イベント定義名」ダイアログの「イベント定義名」フィールドに非ASCII名を入力すると、「ネームスペース」フィールドのネームスペースに接尾辞としてイベント定義名が自動的に使用されます。「OK」をクリックすると、非ASCIIネームスペースがイベントに対して作成されます。ビジネス・イベントの.edl
ファイルで、targetNamespace
要素に非ASCII文字が含まれていることを確認できます。しかし、次の抜粋に示すとおり、これは、SOAコンポーネントでサポートされている現在のXML 1.0仕様に準拠していません。
XML 1.0のネームスペースで、ネームスペースはRFC 3986で定義されたURI参照で識別され、非ASCII文字をエスケープする必要があります。
11gリリース1では、非ASCII文字をエスケープできません。
SOAサーバー・インスタンスでHTTPリスナー・ポートのみが有効(ポートがゼロ以外の値)の場合、生成され、Oracle SOA Suiteで使用される(コールバックURLの生成、公開されるサービスWSDLでの抽象WSDLアノテーションの構築など)サーバーURLもHTTPスキームを持ちます。
同様に、SOAサーバー・インスタンスでHTTPSリスナー・ポートのみが有効な場合、サーバーURLもHTTPSスキームを持ちます。ただし、HTTPとHTTPSの両方のリスナー・ポートが有効な場合、デフォルトSOAサーバーURL値はHTTPスキームを持ちます。Oracle JDeveloperを使用して、そのようなインスタンスで実行されているコンポジットへの参照を作成する場合、コンポジット<import>
はhttp
URLを持ちます。HTTPSを介してWSDLを取得する場合、結果のコンポジットを「ソース」ビューで編集します。また、算出されるデフォルトのサーバーおよびコールバックURLは、soa-infra-config.xml
ファイルでオーバーライドできます。
フォルト・ポリシー再試行アクションは、同じフロー内の複数フォルトで実行されないことがあります。これは、以前のフォルトで再試行数に達していることが原因の場合があります。
たとえば、fault1
とfault2
の2つのフォルト条件でフォルト・ポリシーを定義するとします。両フォルト条件とも、再試行アクションに再試行数は3と指定されています。fault1
が起こり、再試行アクションが3回実行されたとします。ペイロードを変更してfault1
の問題を修正しますが、インスタンスを再発行すると、fault2
が発生するようにします。Oracle Enterprise Manager Fusion Middleware Controlコンソールを使用してフォルトが発生したインスタンスを再発行します。フォルト・ポリシーの指定どおり、2番目のフォルト条件fault2
で3回再試行されることが見込まれます。しかし、その前のfault1
フォルト条件で最大再試行回数がすでに実行されているため、これは起こりません。
ポリシー違反でフォルトが発生したOracle B2Bインスタンスを中断できません。次に例を示します。
EDIFACTを使用してホストおよびリモート取引パートナに対してOracle B2Bを設定します。このシナリオには、各側(ホスト取引パートナとリモート取引パートナ)のB2Bインスタンスを介して通信するSOAコンポジット・アプリケーションが2つあります。
EDIFACTインバウンド・コンポジットBPELサービス・コンポーネントにポリシー(authorization_denyall_policy)をアタッチします。
対応するOracle B2Bのインバウンド・コンポジットが起動されるようイニシエータからメッセージをエンキューします。
インバウンド・コンポジットの参照バインディング・コンポーネントがコールされ、成功します。しかし、BPELコンポーネントにauthorization_denyall_policyがアタッチされているため、これは認可エラーで失敗します。
Oracle Enterprise Manager Fusion Middleware Controlコンソールの「インスタンス」タブに移動し、フォルトが発生したインスタンスを見つけます。
このインスタンスは中断できないことに注意してください。しかし、Oracle Enterprise Manager Fusion Middleware Controlコンソールで成功とレポートされることに注意してください。
バインディング・コンポーネントを使用するSOAコンポジット・アプリケーションの場合、次のシナリオで問題が起こります。
Oracle Enterprise Manager Fusion Middleware Controlコンソールでインバウンド・コンポジット・アプリケーションを停止します。
SOAインフラストラクチャを再起動します。
コンポジットを起動します。
コンポジット・アプリケーションが所定どおり機能しません。たとえば、Oracle B2Bを含むアプリケーションでアウトバウンド側からメッセージをエンキューしたとき、インバウンド・コンポジットが起動しません。
回避方法として、ステップ3の後で次のいずれかの処理を行います。
管理対象サーバーを再起動します。
サーバーを再起動し、コンポジットを再デプロイします。
メディエータ・サービス・コンポーネントは、インスタンスがリカバリ可能かどうかの判断をローカル・トランザクションの正常なコミットに依存します。グレースフル・シャットダウンが正常に行われ、すべてのトランザクションの(特定のタイムアウト・ウィンドウ内での)完了が許可されている場合でも、タイムアウト・ウィンドウ内での発生に失敗したため、拒否されるローカル・トランザクションがあります。たとえば、次のように仮定します。
データベース・アダプタがメッセージをポストします。
メディエータ・サービス・コンポーネントがメッセージを受信し、状態を実行中に設定してBPELプロセス・サービス・コンポーネントを起動し、その状態も実行中に設定します。
JMSアダプタが起動され、例外が発生します。参照フォルト表が更新されます。
BPELプロセスが例外を受け取り、フォルトで終了として状態をマークして、メディエータに例外を再スローします。
グローバル・トランザクションがロールバックされると、BPELプロセスが監査情報の非同期永続をトリガーします。
メディエータが例外を受け取り、エラー表に(別のローカル・トランザクションで)フォルト情報を残します。
メディエータが状態をフォルトに設定します。
トランザクションの完了前(ステップ5から7の間)にサーバーを停止すると、メディエータ・インスタンスが実行中の状態のままになることがあります。コンポーネントから状態が導出される、対応するコンポジット・インスタンスも実行中と表示されます。グローバル・トランザクションがロールバックされると、インバウンド・アダプタによってメッセージが再試行され、再処理されます。このシナリオでは、メディエータ・インスタンスは失われないことに注意してください。
Oracle Enterprise Manager Fusion Middleware Controlコンソールがシングル・サインオン対応の環境で実行されている場合、SOAコンポジットのデプロイ、SOAコンポジットのアンデプロイ、SOAコンポジットの再デプロイのウィザードの最後のステップの一部としてユーザー名とパスワードの資格証明を再入力するよう要求されます。この情報は、Oracle Enterprise Manager Fusion Middleware Controlコンソールのセッションごとに1回のみリクエストされます。
null値を許容する属性の要素を持つ自動マッピング・スキーマでnull値許容属性はマップされますが、要素はマップされません。たとえば、次のソースをマッピングします。
<?xml version= '1.0' encoding= 'UTF-8' ?> . . . . . . <element name="MovieProcess"> <complexType> <sequence> <element name="Director" type="string" nillable="true"/> <element name="casting" type="string" nillable="true"/> </sequence> </complexType> </element> </schema>
ターゲットは次のとおりです。
<?xml version= '1.0' encoding= 'UTF-8' ?> . . . . . . <element name="Movies"> <complexType> <sequence> <element name="name" type="string" nillable="true"/> <element name="starring" type="string" nillable="true"/> </sequence> </complexType> </element> </schema>
この結果、null値許容属性はマップされますが、要素はマップされません。
<xsl:template match="/"> <ns1:Movies> <ns1:name> <xsl:attribute name="xsi:nil"> <xsl:value-of select="/ns1:MovieProcess/ns1:Director/@xsi:nil"/> </xsl:attribute> </ns1:name> <ns1:starring> <xsl:attribute name="xsi:nil"> <xsl:value-of select="/ns1:MovieProcess/ns1:casting/@xsi:nil"/> </xsl:attribute> </ns1:starring> </ns1:Movies> </xsl:template>
回避方法として、xsi:nil
属性の要素を手動でマップする必要があります。
XSLTマッパーの「ノード検索」ダイアログを使用して要素を検索します。このダイアログは、ソースまたはターゲット・スキーマを右クリックし、「検索」を選択すると使用できます。
ソース要素からターゲット要素へドラッグします。
「自動マップ・プリファレンス」ダイアログの下部で「自動マップの有効化」チェック・ボックスを選択解除します。
この結果次のようなマッピングになります。
<xsl:template match="/"> <ns1:Movies> <ns1:name> <xsl:attribute name="xsi:nil"> <xsl:value-of select="/ns1:MovieProcess/ns1:Director/@xsi:nil"/> </xsl:attribute> <xsl:value-of select="/ns1:MovieProcess/ns1:Director"/> </ns1:name> <ns1:starring> <xsl:attribute name="xsi:nil"> <xsl:value-of select="/ns1:MovieProcess/ns1:casting/@xsi:nil"/> </xsl:attribute> <xsl:value-of select="/ns1:MovieProcess/ns1:casting"/> </ns1:starring> </ns1:Movies> </xsl:template>
アダプタ・エンドポイントを使用するSOAコンポジット・アプリケーションがリタイア状態で次のアクションを実行した場合、エンドポイントはアクティブ化されません。
SOAインフラストラクチャの再起動
SOAコンポジット・アプリケーションのアクティブ化
これは、ファイル、レコードなどがエンドポイント・アダプタで取得されないためです。回避方法として、SOAインフラストラクチャの再起動後、SOAコンポジット・アプリケーションを再デプロイします。
Oracle Enterprise Manager Fusion Middleware Controlコンソールで表示されるSOAコンポジット・アプリケーション・インスタンスの数とサービス・コンポーネント・インスタンスの数は、常に一致するわけではありません。
コンポジットが起動されると、まずSOAコンポジット・アプリケーション・インスタンスが作成されます。コンポジット内のサービス・コンポーネントが後続の起動を受け取ると、前に作成されたコンポジット・インスタンスIDを参照する、対応するサービス・コンポーネント・インスタンスが作成されます。
コンポジット・インスタンスは作成されるが、基となるサービス・コンポーネント・インスタンスは作成されないシナリオがあります。次に例を示します。
コンポジット・インスタンスが作成されますが、システム障害で起動がサービス・コンポーネントにまだ達していません。
コンポジット・インスタンスは作成されますが、起動がペイロードの検証に失敗し、拒否されます。この場合、起動は基となるサービス・コンポーネントに達しません。
SOAコンポジット・アプリケーション・インスタンスが作成されていない、孤立したサービス・コンポーネント・インスタンスもあります。
SOAコンポジット・アプリケーション・インスタンス、サービス・コンポーネント・インスタンスおよび孤立したインスタンスの詳細は、『Oracle Fusion Middleware Oracle SOA Suite管理者ガイド』を参照してください。
再試行アクションでのリカバリの失敗後、フォルト・ポリシー・ファイルを使用してフォルトが発生したインスタンスの状態を管理者操作に変更すると、NullPointerException
エラーになります。たとえば、次のタスクを実行するとします。
次を含むSOAコンポジット・アプリケーションを作成します。
インバウンド・ファイル・アダプタ・サービス・バインディング・コンポーネント
メディエータ・サービス・コンポーネント
アウトバウンド・ファイル・アダプタ参照バインディング・コンポーネント
次の設定でフォルト・ポリシーをコンポジットに追加します。
フォルトが発生したら、ora-retry
をコールします。
ora-retry
アクションでretryFailureAction=ora-human-intervention
をコールします。
監査追跡レベルを次のように設定します。
レベル | 監査追跡の設定 |
---|---|
SOAインフラストラクチャ | 開発 |
SOAコンポジット・アプリケーション | オフ |
メディエータ・サービス・エンジン | 本番 |
メディエータ・サービス・コンポーネント | 開発 |
SOAコンポジット・アプリケーションをデプロイします。
SOAコンポジット・アプリケーションのインスタンスを作成します。
フォルトを作成します。
次の詳細に注意してください。
再試行アクションは、フォルト・ポリシー・ファイルに定義されている数に基づいて実行されます。
指定した再試行数の完了後、フォルトが発生したインスタンスの状態は管理者操作に変更されます。
管理者操作状態の変更時、サーバー・ログ・ファイルにNullPointerException
が記録されます。
NullPointerException
が発生しましたが、インスタンスがリカバリ可能で機能が失われていないことに注意してください。
設計時、BPELプロセスでビジネス・フォルトとリモート・フォルトの両方を処理することをお薦めします。コール元BPELプロセスでリモート例外が処理されない場合、SOAコンポジット・アプリケーション・インスタンス全体の状態と、コンポジットに関連付けられているサーバー・コンポーネント・インスタンスの状態が矛盾します。たとえば、コンポジット・インスタンスはフォルト状態でサービス・コンポーネント・インスタンスは完了状態という状況になることもあります。コール元でリモート例外を処理する場合、コンポジットとコンポーネント・インスタンスの状態は正確です。
フォルトが発生したインスタンスの一括リカバリの実行時、「リカバリ・アクション」リストから「続行」を選択し、任意のインスタンスで続行操作が失敗すると、一括リカバリがその時点で停止します。残りのインスタンスはリカバリされません。回避方法として、新しい一括リカバリ操作で残りのインスタンスをリカバリする必要があります。
この項では、構成に関する問題およびその回避方法について説明します。内容は次のとおりです。
表20-1に、監査レベルの設定の優先順位の例を示します。
表20-1 優先順位の例
コンポーネント | コンポジット | サービス・エンジン | SOAインフラストラクチャ | 設定が優先されるもの |
---|---|---|---|---|
プロパティなし |
オフ |
本番 |
開発 |
コンポジット。 監査レベルは「オフ」に設定されます。サービス・エンジンおよびSOAインフラストラクチャの監査レベルによる影響はありません。 |
プロパティなし |
継承 |
開発 |
本番 |
サービス・エンジン。 監査レベルは「開発」に設定されます。ペイロードは割当てアクティビティで表示されます。SOAインフラストラクチャの監査レベルによる影響はありません。 |
プロパティなし |
継承 |
継承 |
本番 |
SOAインフラストラクチャ。 監査レベルは「本番」に設定されます。 |
プロパティなし |
継承 |
本番/開発/オフ/継承 |
オフ |
監査全体が表示されません。 コンポジットはSOAインフラストラクチャから監査レベルを継承します。ペイロードはサービス・エンジンの監査レベルの設定に基づいて割当てアクティビティで表示されます。 |
開発 |
オフ |
本番 |
開発 |
コンポジット。 コンポジットの監査レベルが「オフ」に設定されているため、監査全体が表示されません。サービス・エンジンの監査レベルは表示されますが、コンポーネントの「開発」設定が優先されます。 ペイロードはコンポーネントの監査レベルの設定「開発」に基づいて割当てアクティビティで表示されます。 |
継承 |
オフ |
本番 |
開発 |
コンポジット。 コンポジットの監査レベルが「オフ」に設定されているため、監査全体が表示されません。コンポジットから「オフ」が継承されるため、サービス・エンジンの監査レベルは表示されません。 |
注意:
|
監査レベルと優先順位の詳細は、『Oracle Fusion Middleware Oracle SOA Suite管理者ガイド』を参照してください。
BPELプロセス・サービス・コンポーネントに監査レベルを設定できます。この設定は、SOAインフラストラクチャ、サービス・エンジンおよびSOAコンポジット・アプリケーション・レベルでの監査レベルより優先されます。サービス・コンポーネント・レベルでの設定はBPELプロセスにのみ使用可能で、メディエータ、ヒューマン・ワークフローおよびビジネス・ルール・サービス・コンポーネントではサポートされていません。
BPELプロセス・サービス・コンポーネントに監査レベルを設定する方法は2つあります。サポートされる値は、「オフ」
、「最小」
、「継承」
、「開発」
および「本番」
です。
Oracle Enterprise Manager Fusion Middleware ControlコンソールのシステムMBeanブラウザで次のようにします。
ナビゲーション・ツリーで「SOA」フォルダを展開します。
「soa-infra」を右クリックし、「管理」→「システムMBeanブラウザ」と選択します。
「アプリケーション定義のMBean」→「oracle.soa.config」→「サーバー: server_name」→「SCAComposite」→「Composite_Name」→「SCAComposite.SCAComponent」→「BPEL_Service_Component」→「プロパティ」と選択します。
「追加」アイコンをクリックします。
「Element_number」フォルダを展開します。
複数リストから「false」を選択します。
「名前」フィールドにbpel.config.auditlevel
と入力します。
「値」フィールドに値を入力します。
「適用」をクリックします。
Oracle JDeveloperで次のようにします。
SOAプロジェクトのcomposite.xml
ファイルでbpel.config.auditLevel
プロパティを適切な値に設定します。
<component name="BPELProcess">
<implementation.bpel src="BPELProcess.bpel" />
<property name="bpel.config.auditLevel">Off</property>
</component>
データベースへの接続が遅いため、次のエラー・メッセージが表示されることがあります。
Exception [TOPLINK-4002] (Oracle TopLink - 11g Release 1 (11.1.1.1.0) (Build 090304)): oracle.toplink.exceptions.DatabaseException Internal Exception: java.sql.SQLException: Internal error: Cannot obtain XAConnection weblogic.common.resourcepool.ResourceDeadException: Pool SOADataSource has been disabled because of hanging connection tests, cannot allocate resources to applications.
回避方法として、次の手順を実行します。
$DOMAIN_HOME/bin/
setSOADomainEnv.sh
ファイルを開きます。
太字で示す行をコメント解除します。
# 8331492: Value of weblogic.resourcepool.max_test_wait_secs is 10 # seconds. It can be increased by uncommenting line below if your database # connections are slow. See SOA documentation for more details. EXTRA_JAVA_PROPERTIES="${EXTRA_JAVA_PROPERTIES} -Dweblogic.resourcepool.max_test_wait_secs=30" export EXTRA_JAVA_PROPERTIES
変更を保存し、管理対象Oracle WebLogic Serverを再起動します。
SOAコンポジット・アプリケーションのコンパイル時にメモリー不足のエラーが表示される場合、次の手順を実行してメモリーを増やします。
$ORACLE_HOME/bin
ディレクトリのant-sca-compile.xml
ファイルを開きます。
scac
要素下のメモリー設定を増やします。次に例を示します。
<jvmarg value="-Xmx512M"/>
Oracle Enterprise Manager Fusion Middleware ControlコンソールでOracle SOA Suiteのページのロードに時間がかかる場合、フェッチとインスタンス数情報の表示を無効にすると、ロード時間を改善できます。SOAインフラストラクチャでのロードが多い場合、大幅に改善されます。デフォルトでは、このオプションは設定されていません。
BEA_HOME
/user_projects/domains/
your_domain_name
/bin/startWeblogic.sh
ファイルを開きます。
ファイル内の次の行の上のセクションに移動します。
# START WEBLOGIC echo "starting weblogic with Java version:"
これらの行の上に次の行を追加します。
JAVA_OPTIONS="-Dem.soa.disableCounts=true ${JAVA_OPTIONS}"
変更を有効にするには、Oracle Weblogic管理サーバーを再起動します。
このプロパティ設定によって、すべてのページに表示されるインスタンスとフォルト数のメトリックが無効になります。たとえば、この設定によって「SOAインフラストラクチャ」の「ダッシュボード」ページに次のセクションが表示されません。
「最新のコンポジット・インスタンス」セクションでの「実行中」および「合計」ヘッダーと値。
「デプロイ済コンポジット」セクションでの「インスタンス」および「失敗したインスタンス」列と値。
ADF-BCサービスをSOAコンポジット・アプリケーションから外部参照として起動する場合、ADF-BCアプリケーション名の最後にJBOServiceRegistryを付加してADF-BCの作成ダイアログの「レジストリ」フィールドに入力します。
たとえば、起動するADF BCアプリケーションの名前がhrApp
の場合、「レジストリ」フィールドにhrApp_JBOServiceRegistry
と入力します。
入力したアプリケーション名は、Oracle JDeveloperの「EARデプロイメント・プロファイルのプロパティの編集」ダイアログの「アプリケーション名」フィールドに表示されます。このダイアログには、アプリケーションの「アプリケーション」メニューから「アプリケーション・プロパティ」→「デプロイメント」→「編集」と選択してアクセスできます。
その他の構成タスクをADF-BCアプリケーション側で実行する必要もあります。詳細は、SOAプラットフォームでのADF-BCサービスの使用に関する項を参照してください。
SOAコンポジット・アプリケーションでWebサービス(WS)バインディングを使用してエンドポイント参照を定義する場合、コンポジットをJSP/Javaクラスから起動できません。WSバインディングは、composite.xml
ファイルのbinding.ws port="" location=""
タグで定義されます。
<service name="client_ep" ui:wsdlLocation="BPEL.wsdl">
<interface.wsdl interface="http://xmlns.oracle.com/Application/Project/
BPEL#wsdl.interface(BPEL)"/>
<binding.ws port="http://xmlns.oracle.com/App/BPELProj/
BPELProcess#wsdl.endpoint(bpel_client_ep/BPELProcess_pt)"/>
</service>
かわりに、ADFバインディングを使用します。ADFバインディングを使用してコンポジットをデプロイすると、JSP/Javaクラスからの起動に成功します。
<service name="client_ep" ui:wsdlLocation="BPEL.wsdl">
<interface.wsdl interface="http://xmlns.oracle.com/Application/Project/
BPEL#wsdl.interface(BPEL)"/>
<binding.adf serviceName="bpel_client" registryName=""/>
</service>
ヒューマン・ワークフローでパラレル・タスク割当ての通知を送信する場合、実行時、トランザクションが閉じ、SQL例外が発生して通知処理に時間がかかります。このようになった場合、Oracle WebLogic Server管理コンソールでXAデータソースのXAトランザクション・タイムアウトを増やします。設定されると、この値でグローバル・トランザクション・タイムアウトの値がオーバーライドされます。
「ロックと編集」をクリックします。
「サービス」→「データ・ソース」と選択します。
特定のデータソースをクリックします。
「トランザクション」タブをクリックします。
「XAトランザクション・タイムアウトの設定」を選択します。
「XAトランザクション・タイムアウト」フィールドに、トランザクション・タイムアウトの値を指定します。
「保存」をクリックします。
SQL*Plusにログインします。
distributed_lock_timeout
の値を設定します。
SQL> alter system set distributed_lock_timeout=value scope=spfile;
distributed_lock_timeout
の値をステップ6で設定した値以上に設定することをお薦めします。
このコマンドの実行後、データベースを停止し、再起動します。
設定が変更されていることを確認します。
SQL> show parameter distributed_lock_timeout;
Oracle Real Application Cluster内のすべてのインスタンスでこのパラメータに同じ値を設定します。
SOA管理対象サーバーでPermGen領域のメモリー不足エラーになる場合、次の手順を実行します。
$DOMAIN_HOME/bin/
setSOADomainEnv.sh
ファイルを開きます。
次の値を増やします。
if [ "${JAVA_VENDOR}" != "Oracle" ] ; then DEFAULT_MEM_ARGS="${DEFAULT_MEM_ARGS} -XX:PermSize=128m -XX:MaxPermSize=256m" PORT_MEM_ARGS="${PORT_MEM_ARGS} -XX:PermSize=256m -XX:MaxPermSize=512m" fi
変更後の値:
if [ "${JAVA_VENDOR}" != "Oracle" ] ; then DEFAULT_MEM_ARGS="${DEFAULT_MEM_ARGS} -XX:PermSize=512m -XX:MaxPermSize=1024m" PORT_MEM_ARGS="${PORT_MEM_ARGS} -XX:PermSize=512m -XX:MaxPermSize=1024m" fi
この項では、ドキュメントの訂正箇所を示します。内容は次のとおりです。
『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』の第53章「大きなドキュメントの処理」、大きなペイロード・シナリオに対する正しい設定の使用に関する項に、setDomainEnv.sh
ファイルに次の構文行を追加するよう誤って記載されています。
-Dweblogic.resourcepool.max_test_wait_secs=30
そうではなく、setSOADomainEnv.sh
ファイルのこの既存の行をコメント解除する必要があります。
『Oracle Fusion Middleware Oracle SOA Suite管理者ガイド』の第33章「サービスおよび参照バインディング・コンポーネントの構成」に、Oracle FTP AdapterおよびOracle File AdapterでDistributed
プロパティがサポートされると誤って記載されています。Distributed
プロパティは11gリリースではサポートされません。
『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』の付録A「BPELプロセス・アクティビティとサービス」、Oracle Service Registryのパブリッシュと参照に関する項に、Oracle Service RegistryをSOAコンポジット・アプリケーションに使用する方法が記載されています。ここに、このセクションの追加情報を示します。
この項の手順に、Oracle JDeveloperに組込みのOracle WebLogic Serverではなく、個別にインストールされたOracle SOA Suiteランタイムに対するOracle Service Registryの構成方法が記載されています。
Oracle Service Registry 10.3は10.3.0.0バージョンのOracle WebLogic Serverにデプロイします。
Oracle Service Registry 10.3では10.3.1.0バージョンのOracle WebLogic Serverをサポートしません。
Oracle Enterprise Manager Fusion Middleware Controlコンソールの「SOAインフラストラクチャの共通プロパティ」ページで問合せURLを構成した後、必ずSOAインフラストラクチャを再起動します。詳細は、『Oracle Fusion Middleware Oracle SOA Suite管理者ガイド』を参照してください。
Oracle Service Registryの詳細は、次のURLを参照してください。
http://www.oracle.com/technology/goto/regrep
『Oracle Fusion Middleware Oracle SOA Suite管理者ガイド』の第6章「SOAコンポジット・アプリケーションの保護」、双方向SSL通信用SOAコンポジット・アプリケーションの構成に関する項に、双方向SSLの場合、キーストア情報(場所およびパスワード)が必要と記載されています。この文は無視できます。
また、SOAコンポジット・アプリケーションで別のSOAコンポジット・アプリケーションまたは別の非SOAアプリケーションを起動できるよう次の手順を実行して双方向SSLを有効にします。
注意: サーバーとクライアントの両方が相互認証のSSLについて構成されているものとします。 |
クライアント側の$DOMAIN_HOME/config/soa-infra/configuration/soa-infra-config.xml
でキーストアの場所を指定します。
<keystoreLocation>absolute_path_to_the_keystore_location_and_the_file_name
</keystoreLocation>
Oracle JDeveloperでの設計時、oracle.soa.two.way.ssl.enabled
プロパティを使用してcomposite.xml
ファイルの参照セクションを更新します。
<reference name="Service1"
ui:wsdlLocation=". . .">
<interface.wsdl interface=". . ."/>
<binding.ws port=". . .">
<property name="oracle.soa.two.way.ssl.enabled">true</property>
</binding.ws>
</reference>
Oracle Enterprise Manager Fusion Middleware Controlコンソールで、「WebLogicドメイン」→「domain_name」と選択します。
「domain_name」を右クリックし、「セキュリティ」→「資格証明」と選択します。
「マップの作成」をクリックします。
「マップ名」フィールドに名前(SOA
など)を入力し、「OK」をクリックします。
「キーの作成」をクリックします。
次の詳細を入力します。
フィールド | 説明 |
---|---|
マップの選択 | ステップ6で作成したマップ(この例ではSOA)を選択します。 |
キー | キー名を入力します。 |
タイプ | 「パスワード」を選択します。 |
ユーザー名 | キーストア・ユーザー名を入力します。 |
パスワード | キーストアに対して作成したパスワードを入力します。 |
https
およびsslport
を使用してSOAコンポジット・アプリケーションを起動するようcomposite.xml
の構文を変更します。たとえば、太字で示す構文を変更します。
<?xml version="1.0" encoding="UTF-8" ?> <!-- Generated by Oracle SOA Modeler version 1.0 at [4/1/09 11:01 PM]. --> <composite name="InvokeEchoBPELSync" revision="1.0" label="2009-04-01_23-01-53_994" mode="active" state="on" xmlns="http://xmlns.oracle.com/sca/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy" xmlns:ui="http://xmlns.oracle.com/soa/designer/"> <import namespace="http://xmlns.oracle.com/CustomApps/InvokeEchoBPELSync/BPELProcess1" location="BPELProcess1.wsdl" importType="wsdl"/> <import namespace="http://xmlns.oracle.com/CustomApps/EchoBPELSync/ BPELProcess1"location="http://hostname:port/soa-infra/services/default/EchoBPEL Sync/BPELProcess1.wsdl" importType="wsdl"/>
https
およびsslport
を使用する場合:
location="https://hostname:sslport/soa-infra/services/default/EchoBPELSync /BPELProcess1.wsdl"
『Oracle Fusion Middleware Oracle SOA Suite管理者ガイド』に、Oracle Enterprise Manager Fusion Middleware Controlコンソールの「SOAインフラストラクチャ」の「ダッシュボード」ページの画面ショットが含まれています。「ダッシュボード」ページの「デプロイ済コンポジット」セクションの「フォルト」列は「失敗したインスタンス」という名前に変更されています。
「Composite_Name」ページのインスタンスの「フォルト」タブのオンライン・ヘルプに、リカバリの中断アクションでインスタンス全体が中断されると記載されています。インスタンス全体は中断されません。進行中の現在のアクションのみが中断されます。このため、インスタンスは完了状態になる場合があります。リカバリの中断アクションは、SOAインフラストラクチャまたはSOAコンポジット・アプリケーションの「インスタンス」タブでインスタンスを中断した場合と異なることに注意してください。