この章では、Oracle Mediator(メディエータ)でエラーを処理する方法について説明します。
項目は次のとおりです。
Oracle Mediatorに用意されている高度なエラー処理機能を使用すると、エラーの発生とそれに対応する修正アクション用のメディエータ・サービス・コンポーネントを構成できます。エラー処理によって、メディエータはメッセージ処理中に発生するエラーや外部のWebサービスから戻される例外を処理できます。 メディエータでは、ビジネス・フォルトとシステム・フォルトの両方を処理できます。
ビジネス・フォルトはアプリケーション固有のフォルトであり、サービスWSDLファイルで明示的に定義されます。設計時にOracle JDeveloperでフォルト・ハンドラを定義することでビジネス・フォルトを処理できます。システム・フォルトは、ネットワークが利用できないような基本システムにおける問題によって発生します。 メディエータでは、システム・フォルト用のフォルト・ポリシーをベースとしたエラー処理を提供します。
フォルト・ポリシーにより、エラーを自動または管理者操作で処理できるようになります。 メディエータのフォルト・ポリシーをベースとしたエラー処理は、次の3つのコンポーネントで構成されています。
フォルト・ポリシーは、エラー状態および対応するアクションを定義したものです。フォルト・ポリシーはfault-policies.xml
ファイルで定義されます。 fault-policies.xml
ファイルは、第20.4.1項「fault-policies.xmlのスキーマ定義ファイル」で定義されているXMLスキーマに基づいて作成する必要があります。
注意: フォルト・ポリシーの適用対象は、パラレルのルーティング・ルールのみです。 順次ルーティング・ルールの場合、フォルトはコール元に戻され、そのフォルトの処理はコール元が行います。 コール元がアダプタの場合は、拒否ハンドラをインバウンド・アダプタに定義して、エラーになったメッセージ(拒否メッセージ)を処理できます。 拒否ハンドラの詳細は、『Oracle Fusion Middlewareテクノロジ・アダプタ・ユーザーズ・ガイド』を参照してください。 |
次の例に、サンプルのフォルト・ポリシー・ファイルを示します。
<?xml version="1.0" encoding="UTF-8"?> <faultPolicies> <faultPolicy version="2.0.1" id="CRM_ServiceFaults"> <Conditions> <faultName xmlns:medns="http://schemas.oracle.com/mediator/faults" name="medns:mediatorFault"> <condition> <test>contains($fault.mediatorErrorCode, "TYPE_FATAL_MESH")</test> <action ref="ora-retry"/> </condition> </faultName> </Conditions> <Actions> <Action id="ora-retry"> <retry> <retryCount>3</retryCount> <retryInterval>2</retryInterval> <exponentialBackoff/> <retryFailureAction ref="ora-java"/> <retrySuccessAction ref="ora-terminate"/> </retry> </Action> </Actions> </faultPolicy> </faultPolicies>
次の各項では、フォルト・ポリシーの2つのコンポーネントについて説明します。
条件は、実行するアクションに関連するエラーやフォルトの条件を識別します。特定のエラーやフォルト条件が発生した際に、条件を使用して実行するアクションを確認できます。たとえば、サービスを利用できないことで発生する特定のエラーに対しては、再試行などを実行できます。 同様に、Schematron検証に失敗して発生するエラーに対しては、管理者操作のアクションを実行できます。 このフォルトは、Oracle Enterprise Managerを使用して、ペイロードを編集して再送信することによって手動でリカバリできます。
条件は、次の例に示すようにfault-policies.xml
ファイルで定義されています。
<Conditions> <faultName xmlns:medns="http://schemas.oracle.com/mediator/faults" name="medns:mediatorFault"> <condition> <test>contains($fault.mediatorErrorCode,"TYPE_DATA_TRANSFORMATION")</test> <action ref="ora-java"/> </condition> </faultName> <faultName xmlns:medns="http://schemas.oracle.com/mediator/faults" name="medns:mediatorFault"> <condition> <test>contains($fault.mediatorErrorCode, "TYPE_FATAL_MESH")</test> <action ref="ora-retry"/> </condition> </faultName> <faultName xmlns:medns="http://schemas.oracle.com/mediator/faults" name="medns:mediatorFault"> <condition> <test>contains($fault.mediatorErrorCode,"TYPE_DATA_ASSIGN")</test> <action ref="ora-retry-crm-endpoint"/> </condition> </faultName> </Conditions>
条件を使用したフォルト・タイプの識別
条件を使用して取得可能なフォルトは、次のタイプに分類できます。
メディエータ固有のフォルト
すべてのメディエータ固有のフォルトに対して、メディエータ・エンジンは1つのフォルト({http://schemas.oracle.com/mediator/faults}mediatorFault
)のみをスローします。 すべてのメディエータ・フォルトがこのフォルトにラップされています。 メディエータ・コンポジットによって生成されたエラーまたはフォルトは、次の形式を使用して取得できます。
<faultName xmlns:medns="http://schemas.oracle.com/mediator/faults" name="medns:mediatorFault"> <!-- mediatorFault is a bucket for all the mediator faults --> <condition> <test> contains($fault.mediatorErrorCode, "TYPE_FATAL_MESH") </test> <!-- Captures TYPE_FATAL_MESH errors --> <action ref="ora-retry"/> </condition> </faultName>
ビジネス・フォルトおよびSOAPフォルト
フォルト・ペイロードに基づいたXPath条件を定義することで取得できるエラーまたはフォルト。次に例を示します。
<faultName xmlns:ns1="http://xmlns.oracle.com/Customer" name="ns1:InvalidCustomer"> <!-- Qname of Business/SOAP fault --> <condition> <test> contains($fault.<PART_NAME>/custid, 1011) </test> <!-- xpath condition based on fault payload --> <action ref="ora-retry"/> </condition> </faultName>
参照サービスがビジネス・フォルトを返した場合、そのフォルトはメディエータ・コンポーネントで処理できます。 返されたフォルトは別のコンポーネントに転送したり、ファイル・アダプタなどのアダプタ・サービスにリダイレクトすることができます。また、イベントを発生させることもできます。 ただし、ビジネス・フォルトに対してフォルト・ポリシーとフォルト・ハンドラの両方が定義されている場合は、フォルト・ポリシーがフォルト・ハンドラより優先されます。 この場合、フォルト・ポリシーが正常に実行されると、メディエータ・コンポーネント内のフォルト・ハンドラは無視されます。
アダプタ固有のフォルト
アダプタによって生成されたエラーまたはフォルトは、次の形式を使用して取得できます。
<faultName xmlns:medns="http://schemas.oracle.com/mediator/faults" name="medns:mediatorFault"> <condition> <test>$fault.faultCode = "1"</test> <!-- unique constraint violation in DB adapter--> <action ref="ora-retry"/> </condition> </faultName>
アクションは、エラー発生時に実行する必要があるタスクを指定します。 メディエータにより、フォルト・ポリシーで使用できるアクション・リストが提供されます。 次のリストでは、これらの事前定義のアクションについて説明します。
再試行: 停止したJMSキューへのメッセージのエンキュー、一意キー制約エラーがあるレコードの挿入などを行う再試行アクションを使用すると、エラーの原因となったタスクを再試行できます。 新規スレッドが各再試行アクションとともに開始されます。 このため、各再試行アクションでは、新規トランザクションが開始されます。 再試行アクションに使用可能なオプションは、次のとおりです。
オプション | 説明 |
---|---|
再試行数 | N回の再試行 |
再試行間隔 | 秒単位での再試行の遅延 |
指数バックオフ | 指数バックオフによる再試行間隔の増加 |
再試行失敗時アクション | N回の再試行が失敗となった場合のこのアクションへのチェーン |
再試行成功時アクション | 再試行に成功した場合のこのアクションへのチェーン |
注意: 指数バックオフでは、次の再試行が2倍のdelayでスケジュールされます。ここでのdelayは、現在の再試行間隔です。たとえば、現在の再試行間隔が2秒の場合、次の再試行間隔は4秒にスケジュールされ、その次は8秒、16秒と、retryCount 値に達するまで増分されます。 |
次のコード・スニペットは、再試行アクションの指定方法を示しています。
<Action id="ora-retry"> <retry> <retryCount>3</retryCount> <retryInterval>2</retryInterval> <exponentialBackoff/> <retryFailureAction ref="ora-java"/> <retrySuccessAction ref="ora-java"/> </retry> </Action>
フォルト・ポリシーの再試行間隔に30秒未満の期間を設定すると、指定した間隔内に再試行が実行されない場合があります。 これは、org.quartz.scheduler.idleWaitTime
プロパティのデフォルト値が30秒であり、スケジューラがアイドル状態の場合でも、使用可能なトリガーを再試行するまでに30秒待機するためです。 再試行間隔を30秒未満の値に設定した場合は、待機時間が発生する可能性があります。
30秒未満の再試行間隔を使用する場合は、fabric-config-core.xml
ファイルのセクション<property name="quartzProperties">
の下に次のプロパティを追加します。
org.quartz.scheduler.idleWaitTime=<value>
管理者操作: このアクションは、次の方法で指定できます。
<Action id="ora-human-intervention"><humanIntervention/></Action>
強制終了: このアクションでフローを中止できます。このアクションは、次の方法で指定できます。
<Action id="ora-terminate"><abort/></Action>
Javaコード: このアクションにより、oracle.integration.platform.faultpolicy.IFaultRecoveryJavaClass
インタフェースを実装するカスタマイズJavaクラスをコールできます。 このアクションは、次の方法で指定できます。
注意: 実装済Javaクラスは、文字列を戻すメソッドを実装している必要があります。 ポリシーは、戻された文字列に基づいて新しいアクションにチェーンできます。 |
<Action id="ora-java"> <javaAction className="mypackage.myClass" defaultAction="ora-terminate"> <returnValue value="ABORT" ref="ora-terminate"/> <returnValue value="RETRY" ref="ora-retry"/> <returnValue value="MANUAL" ref="ora-human-intervention"/> </javaAction> </Action>
oracle.integration.platform.faultpolicy.IFaultRecoveryJavaClass
インタフェースおよびoracle.integration.platform.faultpolicy.IFaultRecoveryContext
インタフェースの詳細は、SOA Javadocを参照してください。
フォルト・バインディングは、フォルト・ポリシーをコンポジットまたはコンポーネントと関連付けるもので、fault-bindings.xml
ファイルで定義されています。 fault-bindings.xml
ファイルは、第20.4.2項「fault-bindings.xmlのスキーマ定義ファイル」で定義されているXMLスキーマに基づいて作成する必要があります。
コンポジット: コンポジット内のすべてのメディエータ・コンポーネントに対するフォルト・ポリシーを1つ定義できます。このレベルは、次の方法で指定できます。
<composite faultPolicy="ConnectionFaults"/>
コンポーネント: 1つのメディエータ・コンポーネントに対するフォルト・ポリシーを排他的に定義できます。コンポーネント・レベルのフォルト・ポリシーは、コンポジット・レベルのフォルト・ポリシーを上書きします。このレベルは、次の方法で指定できます。
<component faultPolicy="ConnectionFaults"> <name>Component1</name> <name>Component2</name> </component>
参照: 1つのメディエータ・コンポーネントの参照に対するフォルト・ポリシーを定義できます。このレベルは、次の方法で指定できます。
<reference faultPolicy="policy1"> <name>DBAdapter3</name> </reference>
注意: 管理者操作は、フォルト・ポリシーが定義されていないエラーに対するデフォルト・アクションです。 |
次の例は、フォルト・バインディング・ファイルのサンプルです。
<?xml version="1.0" encoding="UTF-8"?> <faultPolicyBindings version="2.0.1" xmlns="http://schemas.oracle.com/bpel/faultpolicy" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <composite faultPolicy="ConnectionFaults"/> </faultPolicyBindings>
フォルト・ポリシーに条件を定義する一方で、エラー・タイプやエラー・グループにはアクションを指定できます。 前述の例にあるmedns:mediatorFault
は、エラーがメディエータ・エラーであることを表しているのに対し、medns:TYPE_FATAL_MESH
は、エラー・グループを表しています。エラー・グループは、1つ以上の子エラー・タイプで構成されています。TYPE_ALL
は、すべてのメディエータ・エラーを含むエラー・グループです。
次のリストでは、TYPE_ALL
エラー・グループに含まれる様々なエラー・グループについて説明します。
TYPE_DATA
: データ処理に関するエラーが含まれます。
TYPE_DATA_ASSIGN
: データ割当てに関するエラーが含まれます。
TYPE_DATA_FILTERING
: データのフィルタ処理に関するエラーが含まれます。
TYPE_DATA_TRANSFORMATION
: トランスフォーメーション中に発生したエラーが含まれます。
TYPE_DATA_VALIDATION
: ペイロード検証中に発生したエラーが含まれます。
TYPE_METADATA
: メディエータ・メタデータに関するエラーが含まれます。
TYPE_METADATA_FILTERING
: フィルタ処理の条件の処理中に発生したエラーが含まれます。
TYPE_METADATA_TRANSFORMATION
: トランスフォーメーション用のメタデータの取得中に発生したエラーが含まれます。
TYPE_METADATA_VALIDATION
: メディエータ用のメタデータ(.mplan
ファイル)の検証中に発生したエラーが含まれます。
TYPE_METADATA_COMMON
: メタデータの処理中に発生したその他のエラーが含まれます。
TYPE_FATAL
: 容易にリカバリできない致命的なエラーが含まれます。
TYPE_FATAL_DB
: Datasource not found
エラーなど、データベース関連の致命的なエラーが含まれます。
TYPE_FATAL_CACHE
: メディエータ・キャッシュ関連の致命的なエラーが含まれます。
TYPE_FATAL_ERRORHANDLING
: Resubmission queues not available
など、エラー処理中に発生した致命的なエラーが含まれます。
TYPE_FATAL_MESH
: Invoke service not available
など、サービス・インフラストラクチャから発生した致命的なエラーが含まれます。
TYPE_FATAL_MESSAGING
: サービス・インフラストラクチャから発生した致命的なメッセージ・エラーが含まれます。
TYPE_FATAL_TRANSACTION
: Commit can't be called on a transaction which is marked for rollback
など、トランザクションに関する致命的なエラーが含まれます。
TYPE_FATAL_TRANSFORMATION
: トランスフォーメーション時に使用するXPath関数によって発生したエラーなど、致命的なトランスフォーメーション・エラーが含まれます。
TYPE_TRANSIENT
: 再試行でリカバリできる一時エラーが含まれます。
TYPE_TRANSIENT_MESH
: サービス・インフラストラクチャに関するエラーが含まれます。
TYPE_TRANSIENT_MESSAGING
: エンキューやデキューなど、JMSに関するエラーが含まれます。
TYPE_INTERNAL
: 内部エラーが含まれます。
メディエータのエラー処理は、fault-policies.xml
およびfault-bindings.xml
ファイルを使用して有効にできます。
メディエータのエラー処理を有効にする手順は、次のとおりです。
第20.4.1項「fault-policies.xmlのスキーマ定義ファイル」で定義されているスキーマに基づいて、fault-policies.xml
ファイルを作成します。
第20.4.2項「fault-bindings.xmlのスキーマ定義ファイル」で定義されているスキーマに基づいて、fault-bindings.xml
ファイルを作成します。
fault-policies.xml
およびfault-bindings.xml
ファイルをSOAコンポジット・プロジェクトのディレクトリにコピーします。
SOAコンポジット・プロジェクトをデプロイします。
フォルト・ポリシー・ファイルを使用するポリシーベースのリカバリとは別に、Oracle Enterprise Manager Fusion Middleware Controlコンソールでは、リカバリ可能として識別されたメディエータ・フォルトに対して、フォルト・リカバリ・アクションを実行することもできます。 これを実行するには、次の方法があります。
この項では、fault-policies.xml
およびfault-bindings.xml
ファイルのスキーマ・ファイルについて説明します。内容は次のとおりです。
fault-policies.xml
ファイルは、次のXSDファイルに基づいている必要があります。
<?xml version="1.0" encoding="UTF-8"?> <xs:schema targetNamespace="http://schemas.oracle.com/bpel/faultpolicy" xmlns:tns="http://schemas.oracle.com/bpel/faultpolicy" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <!-- Conditions contain a list of fault names --> <xs:element name="Conditions"> <xs:complexType> <xs:sequence> <xs:element name="faultName" type="tns:faultNameType" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <!-- action Ref must exist in the same file --> <xs:complexType name="actionRefType"> <xs:attribute name="ref" type="xs:string" use="required"/> </xs:complexType> <!-- one condition has a test and action, if test is missing, this is the catch all condition --> <xs:complexType name="conditionType"> <xs:all> <xs:element name="test" type="tns:idType" minOccurs="0"/> <xs:element name="action" type="tns:actionRefType"/> </xs:all> </xs:complexType> <!-- One fault name match contains several conditions --> <xs:complexType name="faultNameType"> <xs:sequence> <xs:element name="condition" type="tns:conditionType" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="name" type="xs:QName"/> </xs:complexType> <xs:complexType name="ActionType"> <xs:choice> <xs:element name="retry" type="tns:RetryType"/> <xs:element ref="tns:rethrowFault"/> <xs:element ref="tns:humanIntervention"/> <xs:element ref="tns:abort"/> <xs:element ref="tns:replayScope"/> <xs:element name="javaAction" type="tns:JavaActionType"> <xs:key name="UniqueReturnValue"> <xs:selector xpath="tns:returnValue"/> <xs:field xpath="@value"/> </xs:key> </xs:element> </xs:choice> <xs:attribute name="id" type="tns:idType" use="required"/> </xs:complexType> <xs:element name="Actions"> <xs:annotation> <xs:documentation>Fault Recovery Actions</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element name="Action" type="tns:ActionType" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="JavaActionType"> <xs:annotation> <xs:documentation>This action invokes java code provided</xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="returnValue" type="tns:ReturnValueType" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="className" type="tns:idType" use="required"/> <xs:attribute name="defaultAction" type="tns:idType" use="required"/> <xs:attribute name="propertySet" type="tns:idType"/> </xs:complexType> <xs:complexType name="RetryType"> <xs:annotation> <xs:documentation>This action attempts retry of activity execution</xs:documentation> </xs:annotation> <xs:all> <xs:element ref="tns:retryCount"/> <xs:element ref="tns:retryInterval"/> <xs:element ref="tns:exponentialBackoff" minOccurs="0"/> <xs:element name="retryFailureAction" type="tns:retryFailureActionType" minOccurs="0"/> <xs:element name="retrySuccessAction" type="tns:retrySuccessActionType" minOccurs="0"/> </xs:all> </xs:complexType> <xs:simpleType name="idType"> <xs:restriction base="xs:string"> <xs:minLength value="1"/> </xs:restriction> </xs:simpleType> <xs:complexType name="ReturnValueType"> <xs:annotation> <xs:documentation>Return value from java code can chain another action using return values</xs:documentation> </xs:annotation> <xs:attribute name="value" type="tns:idType" use="required"/> <xs:attribute name="ref" type="xs:string" use="required"/> </xs:complexType> <xs:element name="exponentialBackoff"> <xs:annotation> <xs:documentation>Setting this will cause retry attempts to use exponentialBackoff algorithm</xs:documentation> </xs:annotation> <xs:complexType/> </xs:element> <xs:element name="humanIntervention"> <xs:annotation> <xs:documentation>This action causes the activity to freeze</xs:documentation> </xs:annotation> <xs:complexType/> </xs:element> <xs:element name="replayScope"> <xs:annotation> <xs:documentation>This action replays the immediate enclosing scope</xs:documentation> </xs:annotation> <xs:complexType/> </xs:element> <xs:element name="rethrowFault"> <xs:annotation> <xs:documentation>This action will rethrow the fault</xs:documentation> </xs:annotation> <xs:complexType/> </xs:element> <xs:element name="retryCount" type="xs:positiveInteger"> <xs:annotation> <xs:documentation>This value is used to identify number of retries</xs:documentation> </xs:annotation> </xs:element> <xs:complexType name="retryFailureActionType"> <xs:annotation> <xs:documentation>This is the action to be chained if retry attempts fail</xs:documentation> </xs:annotation> <xs:attribute name="ref" type="xs:string" use="required"/> </xs:complexType> <xs:complexType name="retrySuccessActionType"> <xs:annotation> <xs:documentation>This is the action to be chained if retry attempts is successful</xs:documentation> </xs:annotation> <xs:attribute name="ref" type="xs:string" use="required"/> </xs:complexType> <xs:element name="retryInterval" type="xs:unsignedLong"> <xs:annotation> <xs:documentation>This is the delay in milliseconds of retry attempts</xs:documentation> </xs:annotation> </xs:element> <xs:element name="abort"> <xs:annotation> <xs:documentation>This action terminates the process</xs:documentation> </xs:annotation> <xs:complexType/> </xs:element> <xs:element name="Properties"> <xs:annotation> <xs:documentation>Properties that can be passes to a custom java class</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element name="propertySet" type="tns:PropertySetType" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="PropertySetType"> <xs:sequence> <xs:element name="property" type="tns:PropertyValueType" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="name" type="tns:idType" use="required"/> </xs:complexType> <xs:complexType name="PropertyValueType"> <xs:simpleContent> <xs:extension base="tns:idType"> <xs:attribute name="name" type="tns:idType" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:element name="faultPolicy"> <xs:complexType> <xs:sequence> <xs:element ref="tns:Conditions"/> <xs:element ref="tns:Actions"/> <xs:element ref="tns:Properties" minOccurs="0"/> <!--Every policy has on Conditions and and one Actions, however, Properties is optional --> </xs:sequence> <xs:attribute name="id" type="tns:idType" use="required"/> <xs:attribute name="version" type="xs:string" default="2.0.1"/> </xs:complexType> <xs:key name="UniqueActionId"> <xs:selector xpath="tns:Actions/tns:Action"/> <xs:field xpath="@id"/> </xs:key> <xs:key name="UniquePropertySetId"> <xs:selector xpath="tns:Properties/tns:property_set"/> <xs:field xpath="@id"/> </xs:key> <xs:keyref name="RetryActionRef" refer="tns:UniqueActionId"> <xs:selector xpath="tns:Actions/tns:Action/tns:retry/tns:retryFailureAction"/> <xs:field xpath="@ref"/> </xs:keyref> <xs:keyref name="RetrySuccessActionRef" refer="tns:UniqueActionId"> <xs:selector xpath="tns:Actions/tns:Action/tns:retry/tns:retrySuccessAction"/> <xs:field xpath="@ref"/> </xs:keyref> <xs:keyref name="JavaActionRef" refer="tns:UniqueActionId"> <xs:selector xpath="tns:Actions/tns:Action/tns:javaAction/tns:returnValue"/> <xs:field xpath="@ref"/> </xs:keyref> <xs:keyref name="ConditionActionRef" refer="tns:UniqueActionId"> <xs:selector xpath="tns:Conditions/tns:faultName/tns:condition/tns:action"/> <xs:field xpath="@ref"/> </xs:keyref> <xs:keyref name="JavaDefaultActionRef" refer="tns:UniqueActionId"> <xs:selector xpath="tns:Actions/tns:Action/tns:javaAction"/> <xs:field xpath="@defaultAction"/> </xs:keyref> <xs:keyref name="JavaPropertySetRef" refer="tns:UniquePropertySetId"> <xs:selector xpath="tns:Actions/tns:Action/tns:javaAction"/> <xs:field xpath="@property_set"/> </xs:keyref> </xs:element> <xs:element name="faultPolicies"> <xs:complexType> <xs:sequence> <xs:element ref="tns:faultPolicy" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
fault-bindings.xml
ファイルは、次のXSDファイルに基づいている必要があります。
<?xml version="1.0" encoding="UTF-8"?> <xs:schema targetNamespace="http://schemas.oracle.com/bpel/faultpolicy" xmlns:tns="http://schemas.oracle.com/bpel/faultpolicy" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="faultPolicyBindings"> <xs:annotation> <xs:documentation>Bindings to a specific fault policy </xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element name="composite" type="tns:compositeType" minOccurs="0" maxOccurs="1"/> <xs:element name="component" type="tns:componentType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="reference" type="tns:referenceType" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="version" type="xs:string" default="2.0.1"/> </xs:complexType> <xs:key name="UniquePartnerLinkName"> <xs:selector xpath="tns:reference/tns:name"/> <xs:field xpath="."/> </xs:key> <xs:key name="UniquePortType"> <xs:selector xpath="tns:reference/tns:portType"/> <xs:field xpath="."/> </xs:key> <xs:key name="UniquePolicyName"> <xs:selector xpath="tns:reference"/> <xs:field xpath="@faultPolicy"/> </xs:key> </xs:element> <xs:simpleType name="nameType"> <xs:restriction base="xs:string"> <xs:minLength value="1"/> </xs:restriction> </xs:simpleType> <xs:complexType name="propertyType"> <xs:simpleContent> <xs:extension base="tns:nameType"> <xs:attribute name="name" type="xs:string" use="required" fixed="faultPolicy"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name="referenceType"> <xs:annotation> <xs:documentation>Bindings for a partner link. Overrides composite level binding.</xs:documentation> </xs:annotation> <xs:sequence> <xs:annotation> <xs:documentation>Specification at partner link name overrides specification for a port type</xs:documentation> </xs:annotation> <xs:element name="name" type="tns:nameType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="portType" type="xs:QName" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="faultPolicy" type="tns:nameType" use="required"/> </xs:complexType> <xs:complexType name="componentType"> <xs:annotation> <xs:documentation>Binding for a component </xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="name" type="tns:nameType" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="faultPolicy" type="tns:nameType" use="required"/> </xs:complexType> <xs:complexType name="compositeType"> <xs:annotation> <xs:documentation>Binding for the entire composite</xs:documentation> </xs:annotation> <xs:attribute name="faultPolicy" type="tns:nameType" use="required"/> </xs:complexType> </xs:schema>