Try スコープ (<try/>)

logo cloud IDE Cloud IDE

logo desktop IDE Desktop IDE

スコープ内のコンポーネントの実行中に発生する可能性のあるエラーを処理します。

Try スコープは、スコープに追加したコンポーネントによってスローされた例外をキャッチして処理します。スコープ内のエラー処理は、Flow コンポーネント内のエラー処理と似ています。個別のフローを設定する代わりに、Flow コンポーネント内で Try を使用できます。

ペイロードを変更したり、変数を追加、変更、または削除したりすると、実行の残りの部分に伝播されます。エラーハンドラー内での変更も伝播されます。

Try スコープではトランザクションがサポートされています。トランザクションとは、正常に実行される必要がある一連のアクションです。エラーが伝播されてトランザクションがロールバックされるか、またはエラーが処理されてトランザクションがコミットされるかによって、成功または失敗する 1 つの単位として Try スコープ内のコンポーネントを設定します。どちらの場合でも、Try スコープを含むフローは処理を続行します。

コンポーネント XML

このコンポーネントは、次の XML 構造をサポートします。

<try
  doc:name="Try"
  doc:id="dieaig"
  transactionalAction="${action}" />
<try/>​ Attributes 説明

doc:name

コンポーネントの編集可能な名前。

doc:id

コンポーネントの自動生成された識別子。

transactionalAction

トランザクションの処理方法を定義します。可能な値:

  • Ignore (無視) (​INDIFFERENT​)

    デフォルト。トランザクションが有効であれば、スコープがトランザクションに結合します。そうでない場合は、スコープはトランザクションを作成しません。

  • Always Begin (常に開始) (​ALWAYS_BEGIN​)

    スコープを実行する度に、新しいトランザクションが開始されます。

  • Begin or Join (開始または結合) (​BEGIN_OR_JOIN​)

    実行順序が (フロー外で発生する非同期アクションなどによって) 変化する場合にのみ適用されます。 フローの現在の処理ですでにトランザクションが開始されている場合は、スコープはそのトランザクションに結合します。そうでない場合は、スコープは新しいトランザクションを開始します。

transactionType

トランザクションの種別を指定します。可能な値:

  • LOCAL

    デフォルト。単一またはローカルトランザクション。

  • XA

    複数のリソースからの操作をグループ化し、拡張アーキテクチャ (XA) 標準に準拠するトランザクション。

次の例は、異なる状況でトランザクションを処理するために Try スコープを設定する方法を示しています。

例: Try スコープでの異なるトランザクションアクション

次の例は、フローレベルでトランザクションを開始するように設定された ​jms:listener​ 操作、トランザクションを (設定に従って) 開始または結合しようとする Try スコープ、そしてトランザクションの外部で実行するように設定された ​jms:publish​ 操作を示しています。

<flow name="someFlow">
	<jms:listener config-ref="JMS_Config" destination="test.in" transactionalAction="ALWAYS_BEGIN"/>
	<!-- Processors -->
	<try transactionalAction="${action}">
		<!-- Processors -->
		<!-- Join if possible is the default value for jms:publish operation -->
		<jms:publish config-ref="JMS_Config" destination="test.out" transactionalAction="NOT_SUPPORTED"/>
		<raise-error type="APP:SOME"/>
		<!-- More Processors -->
	</try>
	<!-- Processors -->
</flow>

Try スコープ内の操作でエラーが発生しなければ、設定されている ​transactionalAction​ 値には関係なく、スコープは実行を完了してトランザクションをコミットします。

<raise-error/>​ コンポーネントが追加されると、Try スコープの ​transactionalAction​ によってトランザクションとメッセージの処理方法が変わります。

  • Ignore (無視) (​INDIFFERENT​)

    この場合は、Try スコープ内で操作を実行しながらトランザクションが継続します。エラーが発生すると、接続元に伝播されます (​<on-error-continue>​ エラーハンドラーでは処理しません)。トランザクションがロールバックされ、メッセージが JMS キューで再び使用できるようになります。このロールバックは、すでに完了している ​jms:publish​ 操作には影響しません。​transactionAction​ がデフォルトの ​NOT_SUPPORTED​ に設定されているため、この操作はトランザクションスコープの外部となります。

    transactionAction​ が ​JOIN_IF_POSSIBLE​ に設定されていれば、​jms:publish​ 操作もロールバックされます。

  • Always Begin (常に開始) (​ALWAYS_BEGIN​)

    有効なトランザクションがすでに存在するため、エラーが発生します。

  • Begin or Join (開始または結合) (​BEGIN_OR_JOIN​)

    この場合は、すでにトランザクションが開始されているため、スコープは有効なトランザクションに結合します。結果は ​INDIFFERENT​ の場合と同じです。

例: フローレベルでのエラー処理

次の例には、フローレベルのエラーハンドラーが含まれています。

次の例では、エラーハンドラーをフローレベルで追加しています。

<flow name="someFlow">
	<jms:listener config-ref="JMS_Config" destination="test.in" transactionalAction="ALWAYS_BEGIN"/>
	<!-- Processors -->
	<try transactionalAction="${action}">
		<!-- Processors -->
		<!-- Join if possible is the default value for jms:publish operation -->
		<jms:publish config-ref="JMS_Config" destination="test.out"/>
		<raise-error type="APP:SOME"/>
		<!-- More Processors -->
	</try>
	<!-- Processors -->
	<error-handler>
		<on-error-continue/>
	</error-handler>
</flow>

この例の動作は次のようになります。

  • Ignore (無視) (​INDIFFERENT​)

    トランザクションは続行します。エラーは ​on-error-continue​ エラーハンドラーで処理されるため、トランザクションはコミットされます。​jms:listener​ 接続元から読み出されたメッセージはコンシュームされ、​jms:publish​ 操作で処理されたメッセージが実際に送信されます。

  • Always Begin (常に開始) (​ALWAYS_BEGIN​)

    有効なトランザクションがすでに存在するため、エラーが発生します。

  • Begin or Join (開始または結合) (​BEGIN_OR_JOIN​)

    INDIFFERENT​ と同じ動作となります。

例: Try スコープ内のエラー処理

次の例では、エラーハンドラーが Try スコープ内にあり、スコープの実行後にエラーが発生します。

<flow name="someFlow">
	<jms:listener config-ref="JMS_Config" destination="test.in" transactionalAction="ALWAYS_BEGIN"/>
	<!-- Processors -->
	<try transactionalAction="${action}">
		<!-- Processors -->
		<!-- Join if possible is the default value for jms:publish operation -->
		<jms:publish config-ref="JMS_Config" destination="test.out"/>
		<!-- More Processors -->
		<!-- There could be a component that raises an error, it will be handled by the error handler -->
		<error-handler>
			<on-error-continue/>
		</error-handler>
	</try>
	<!-- Processors -->
	<raise-error type="APP:SOME"/>
</flow>

設定されている ​transactionalAction​ に従って、Try スコープ内の動作は次のいずれかになります。

  • Ignore (無視) (​INDIFFERENT​)

    トランザクションは続行しますが、エラーはフローレベルの ​on-error-continue​ では処理されないため、トランザクションがロールバックされ、メッセージは送信されません。

  • Always Begin (常に開始) (​ALWAYS_BEGIN​)

    有効なトランザクションがすでに存在するため、エラーが発生します。

  • Begin or Join (開始または結合) (​BEGIN_OR_JOIN​)

    INDIFFERENT​ と同じ動作となります。

エラー処理

フローを設計するときは、Try スコープの内部でエラーが発生しやすい操作をグループ化します。Try スコープにより、フローで問題を起こす可能性のある操作を隔離して、エラー処理メソッドに割り当てることができます。また、Try スコープ内の操作をトランザクションとして処理するように設定することもできます。

Try スコープはエラー処理戦略を持ち、フローのエラー処理を設定するのと同じように設定できます。

Try スコープは、さまざまなエラー種別の条件を見極めて、異なる動作を適用します。Try スコープ内のコンポーネントでエラーが発生すると、Try スコープのエラーハンドラーが実行されます。この時点で、エラーを調査することができ、ハンドラーは状況に応じて実行および動作できます。

  • On Error Continue

    実行後に結果をコンテナ Try スコープに送信します。コンテナ Try スコープは、渡された結果を使用して実行を正常に完了します。この時点でのトランザクションはすべてコミットされます。

  • On Error Propagate

    すべてのトランザクションをロールバックし、実行後に結果を使用して既存のエラーを再びスローします。これにより、コンテナ Try スコープの実行は失敗します。