On-Error エラーハンドラ

このバージョンの Mule は、拡張サポートが終了する 2023 年 5 月 2 日にその すべてのサポート​が終了しました。

このバージョンの Mule を使用する CloudHub には新しいアプリケーションをデプロイできなくなります。許可されるのはアプリケーションへのインプレース更新のみになります。

標準サポートが適用されている最新バージョンの Mule 4 にアップグレード​することをお勧めします。これにより、最新の修正とセキュリティ機能強化を備えたアプリケーションが実行されます。

Mule アプリケーションでエラーが発生すると、Error Handler コンポーネントでエラーが HTTP:NOT_FOUND​、DB:CONNECTIVITY、ANY (すべての Mule エラーのデフォルト) など、Mule エラーに一致した最初の On-Error コンポーネント (On Error Continue または On Error Propagate) 設定にルーティングされます。エラーについてエラー処理が設定されていない場合、アプリケーションは​デフォルトのエラー処理​プロセスに従います。

error handlers
Figure 1. Studio のエラー処理コンポーネント

On-Error コンポーネントでは、​オーナー​に与える影響で違いがあります。つまり、定義されている Flow または Try スコープです。

On Error Propagate

実行しますが、含む側のスコープ (たとえば、エラーが発生した Try スコープが含まれるフロー) またはエラーが発生したフローに対するフロー参照が含まれる外部フローなど、上のレベルにエラーを伝播します。 エラーによってオーナーの実行が中断され、その上のレベルに伝播するため、そのレベルで失敗となります。さらに、オーナーが処理するトランザクションがロールバックされます。ただし、別のコンポーネント (On Error Propagate を所有しないコンポーネント) でトランザクションが作成された場合は、トランザクションはロールバックされません。

error handling e77ec
On Error Continue

実行し、オーナーが実行を正常に完了したかのように、実行の結果をそのオーナーの結果として使用します。オーナーが処理するトランザクションはコミットされます。ただし、別のコンポーネント (On Error Propagate を所有しないコンポーネント) でトランザクションが作成された場合は、トランザクションはコミットされません。

エラーの照合

Mule アプリケーションのデザイン中にエラーの可能性を識別して処理できるように、On-Error コンポーネントではアプリケーションで設定される Runtime Engine および操作によってスローされる可能性があるエラーをリストしています。処理するエラーを選択できます。

  • 照合: On-Error コンポーネントでは選択した​エラー種別​に基づいて照合を実行できます。選択可能なエラー種別のリストは、On-Error コンポーネントが適用されるフローまたはスコープ内のモジュールおよびコネクタ操作に応じて異なります。また、ランタイムでスローされる可能性がある ​EXPRESSION​ エラーと ​STREAM_MAXIMUM_SIZE_EXCEEDED​ エラーもリストしています。

    error handlers selected types

  • 式の照合 (より高度なユースケース向け): On-Error コンポーネントの ​When​ 項目で定義した ​when​ 条件に基づいてエラー照合を実行できます。たとえば、コンポーネントを「fatal (致命的)」という語が含まれるエラーメッセージがある致命的なエラーにマップすることができます。

    • UI での ​When​ 項目の設定: error.cause.message contains "fatal"

    • XML 設定の例:

      <on-error-continue
        enableNotifications="true" logException="true"
        type="ANY"
        when='error.cause.message contains "fatal"'/>

照合条件は、On-Error コンポーネントがエラーハンドラに存在する順番で連続的に評価されます。たとえば ​VALIDATION:NOT_NULL​ をある方法で処理し、その他のすべてのエラーを別の方法で処理する場合は、残りのエラーを捕捉するコンポーネント (2 つ目の On-Error コンポーネントで ​ANY​ として識別) の前に、そのエラーの On-Error コンポーネント設定を指定します。明示的に照合しないエラーまたは ANY を使用して捕捉するエラーでは、デフォルトのエラー処理が実行されます。

次のエラーハンドラは、​VALIDATION:NOT_NULL​ エラーに対して ​{ "messageANY" : "Some other error" }​ ではなく ​{ "MyError": "value was expected to be null" }​ を生成するように設定されています。. 文字列 ​value was expected to be null​ は ​VALIDATION:NOT_NULL​ エラーの説明です。Is Null コンポーネントがこのエラーをスローできます。 Is Null は検証モジュールに属しています。

<error-handler >
  <on-error-continue enableNotifications="true"
    logException="true"
    type="VALIDATION:NOT_NULL">
    <ee:transform >
      <ee:message>
        <ee:set-payload><![CDATA[%dw 2.0
output application/json
---
{
MyError : error.description as String
}]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </on-error-continue>
  <on-error-continue
    enableNotifications="true"
    logException="true"
    type="ANY">
    <ee:transform>
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
"messageANY" : "Some other error"
}
]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </on-error-continue>
</error-handler>

デフォルトでは、On-Error コンポーネントによって一致するエラーも記録され、エラーが発生した場合のエラーの通知も有効になります。これらの設定は XML を使用して無効にできます。

設定と使用

ほとんどの場合、On Error コンポーネントはスコープに似た Error Handler コンポーネント内で設定します。各フローには組み込みの Error Handler が 1 つだけ含まれますが、Error Handler には必要に応じて任意の数の On-Error コンポーネントを含めることができ、各 On-Error コンポーネントには Logger など、On-Error コンポーネントによって捕捉されたエラーを処理するコンポーネントを任意の数含めることができます。

Error Handler コンポーネントは Flow コンポーネントおよび Try コンポーネントに組み込まれているため、On-Error コンポーネントをフローのスコープ内または Try コンポーネント内で発生したエラーに使用できます。例は、​「On-Error コンポーネントを使用したメッセージングエラーの処理」​を参照してください。

On-Error コンポーネントは、Flow コンポーネントまたは Try スコープから参照される個別の Error Handler 設定で使用することもできます (​「グローバルエラーハンドラの参照」​を参照)。

フロー内のエラー処理

フロー内の組み込み Error Handler コンポーネント内部で、エラー種別と式を照合する On Error コンポーネントを 1 つ以上セットアップできます。次の例は、任意のフロー内で発生したエラーを処理する一般的な構造を示しています。1 つのフローでは、Error Handler コンポーネントの On Error Continue (​on-error-continue​) を使用します。もう 1 つのフローでは On Error Propagate (​on-error-propagate​) を使用します。

<flow name="catch">
  <!-- flow logic -->
  <error-handler>
    <on-error-continue>
      <!-- error handling logic -->
    </on-error-continue>
  </error-handler>
</flow>

<flow name="rollback">
  <!-- flow logic -->
  <error-handler>
    <on-error-propagate>
      <!-- error handling logic -->
    </on-error-propagate>
  </error-handler>
</flow>

On Error スコープの再利用

グローバルに公開してフローおよび Try スコープで参照することでエラーハンドラを共有できるのと同じように、On-Error コンポーネントを再利用することもできます。On-Error コンポーネントをグローバルに定義して名前を付けてから、Error Handler コンポーネントから参照できます。

例: 参照される On-Error の XML 設定
<on-error-propagate name="sharedPropagateHandler">
  <logger message="An unhandled error has occurred."/>
</on-error-propagate>

<on-error-continue type="EXPRESSION" name="sharedContinueHandler">
  <logger message="An expression failed to evaluate."/>
</on-error-continue>

<error-handler name="reusingHandlers">
  <on-error ref="sharedContinueHandler"/>
  <on-error-continue type="ROUTING">
    <logger message="An expression failed to evaluate."/>
  </on-error-continue>
  <on-error ref="sharedPropagateHandler"/>
</error-handler>

他の再利用の例は、​「グローバルエラーハンドラの参照」​を参照してください。