Mule 4.3 の新機能

Mule Runtime Engine のバージョン 4.3 では、アプリケーションのパフォーマンスが大幅に向上するのに加えて、引き続き Anypoint Platform でのアプリケーション開発を効率化でき、組織の活動に不可欠なユースケースで弾力性のあるランタイムを実現できます。

この新バージョンで実現されたすべての機能強化を活用するために、アプリケーションを Mule 4.3 に移行することをお勧めします。

スレッドモデル

Mule 4.3 のスレッド処理は Mule 4.2 や 4.1 とは異なります。

以前のバージョンでは、Mule は 3 つの異なるスレッドプールを所有し、管理していました。これらのスレッドプールはそれぞれ異なる処理種別 (​CPU_LIGHT​、IO、​CPU_INTENSIVE​) 専用でした。タスクはプロアクター設計パターンを使用してこれらのプールに送信されていました。

Mule 4.3 以降では、引き続きプロアクターパターンが適用されますが、これらのスレッドプールが 1 つの一意のスレッドプールに結合されました。

新しいスレッドモデルおよびアップグレード手順についての詳細は、​「実行エンジン」​を参照してください。

DataWeave の更新

Mule 4.3.0 リリースには DataWeave 2.3.0 の機能が含まれています。

更新の構文

この機能により、機能の再帰について理解することなく、ネストされたデータ構造で 1 つの値を簡単に更新できるようになります。

次のオブジェクトの配列は、DataWeave ソースに対する入力ペイロードになります。

入力:
[
   {
       "ID" : 4128506,
       "name": "Ken",
       "age": 30
   },
   {
       "ID" : 1823940,
       "name": "Tomo",
       "age": 70
   },
   {
       "ID": 9086582,
       "name": "Kajika",
       "age": 10
   }
]

次の DataWeave スクリプトでは、​map​ 関数を使用してオブジェクトの入力配列の要素で反復処理を行います。新しい ​update​ 演算子を使用して各オブジェクトの 2 つのキー - 値ペアを変更します: 値が ​"Tomo"​ の場合は ​"name"​ キーの値に文字列 ​" (Christian)"​ を結合 (​++​) し、すべての ​"age"​ キーの値を ​1​ 増加させます。

取得元:
%dw 2.0
output application/json
---
payload map ((user) ->
   user update {
       case name at .name if(name == "Tomo") -> name ++ " (Christian)"
       case age at .age -> age + 1
   }
)

JSON 出力により、文字列 ​" (Christian)"​ が値 ​"Tomo"​ に追加され、​"age"​ 値が ​1​ 増加されていることがわかります。​"Tomo"​ に一致しない ​"name"​ キー値と同じく、​"ID"​ キーの値は同じままです。

出力:
[
 {
   "ID": 4128506,
   "name": "Ken",
   "age": 31
 },
 {
   "ID": 1823940,
   "name": "Tomo (Christian)",
   "age": 71
 },
 {
   "ID": 9086582,
   "name": "Kajika",
   "age": 11
 }
]

詳細なドキュメントについては、​「update 演算子」​を参照してください。

ストリーミング機能および機能強化

  • XML ストリーミング:
    XML 形式の DataWeave リーダーでストリーミングがサポートされるようになりました。ストリーミングを有効化するには、​collectionPath​ および ​streaming​ リーダープロパティを指定する必要があります。

    ストリーミングを行う場合、XML パーサーはすべての XML コンテンツがなくてもコンテンツの処理を開始できます。これは、大きなコンテンツを扱うときに特に便利です。

    詳細は、​「XML 形式」​を参照してください。

  • JSON のストリーミングの改善:
    JSON リーダーで配列のみではなく JSON ドキュメント全体のストリーミングがサポートされるようになりました。

    詳細は、​「JSON 形式」​を参照してください。

Literal (リテラル) 型

この機能により、Literal (リテラル) 型に対する DataWeave のサポートが実現されます。Literal (リテラル) 型は、ちょうど 1 つの値を表すデータ型です。つまり、たとえば、DataWeave はデータ型 ​hello​ を使用して ​String​ 値 ​"hello"​ を表すことができます。この機能により、関数のオーバーロードがきわめて動的になり、​Union​ 型と組み合わせた場合に、DataWeave でデータ型としてリテラル値の列挙を表せるようになります。たとえば、次のようになります。

type Weekdays = "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday"
type Days = Weekdays | "Saturday" | "Sunday"

fun greeting(day : "Monday") = "Best of luck in this new work week!"
fun greeting(day : "Friday") = "YAY, it's Friday! Have an awesome day!"
fun greeting(day: Weekdays) = "Have a nice day at work!"
fun greeting(day: Days) = "We hope you have a great day!"

greeting​ 関数によって次のメッセージが表示されます。

  • 週末 (土曜日と日曜日のみ) には一般的なメッセージ (​"We hope you have a great day!"​)。

  • 火曜日から木曜日には仕事固有のメッセージ (​"Have a nice day at work!"​)。

  • 平日の初日と最終日 (月曜日と金曜日) にはカスタマイズしたメッセージ。

DataWeave は、スクリプトで関数が宣言されている順序に従って、関数コールの引数を受け入れる最初の関数を使用します。

詳細なドキュメントについては、​「Literal (リテラル) 型」​を参照してください。

Period (期間) と DateTime (日時) の一貫性

この機能により、期間を簡単に操作し、結果を別の単位に変換して、期間を複数の部分に分解できるようになります。

次の例は、​Duration​ 値を分解する方法を示しています。ヘッダーで 1 つの ​DateTime​ 値を別の値から減算する ​period​ 変数を定義しています。このスクリプトでは、生成された ​period​ 値から ​hours​ 値、​minutes​ 値、​secs​ 値を選択して、操作の結果を分解しています。

取得元:
%dw 2.0
output application/json
var period = (|2010-12-10T12:10:12| - |2010-12-10T10:02:10|)
---
{
   hours:  period.hours,
   minutes:  period.minutes,
   secs:  period.secs,
}

JSON 出力では、​period​ から選択された ​hours​ 値、​minutes​ 値、​secs​ 値の生成された数値が表示されます。

出力:
{
  "hours": 2,
  "minutes": 8,
  "secs": 2
}

詳細なドキュメントについては、​「期間」​を参照してください。

カスタム MIME タイプ

この機能により、出力データ形式とは別に出力 MIME タイプを定義できます。また、出力形式と入力形式の定義がよりシンプルになります。

%dw 2.0
output json
---
{
	Hello: “there”
}

ドキュメントについては、​「MIME タイプの設定」​を参照してください。

パフォーマンスの向上

DataWeave により、このリリースのメモリ使用、関数 (​groupBy​ など)、内部実行エンジンのパフォーマンスが改善されます。

  • 共通部分式の除去:
    共通部分式除去は、スクリプトを最適化するために含まれています。DataWeave では、反復される部分式を表す内部変数を定義し、これによってその部分式の実行の反復を 1 つの式に置き換えることで、スクリプトが最適化されるようになりました。

    ソース
    %dw 2.0
    output json
    ---
    {
       code: payload.message.code,
       message : payload.message.value,
       user : payload.message.users[0].name,
       contact: payload.message.users[0].email
    }

    内部的には、上記の例のスクリプトは次の例で示しているように処理されます。ここで、変数は反復される各式について定義されるため、1 回しか実行されません。

    内部表現
    %dw 2.0
    output json
    
    var fakeVariable1 = payload.message
    var fakeVariable2 = fakeVariable1.users[0]
    ---
    {
       code: fakeVariable1.code,
       message : fakeVariable1.value,
       user : fakeVariable2.name,
       contact: fakeVariable2.email
    }
  • メモリ管理の改善:
    メモリ管理が一元化されました。ダイレクトメモリのプールやヒープメモリの排他的な使用など、いくつかのメモリ管理戦略が含まれています。

DataWeave モジュール

DataWeave では、データ型イントロスペクションをサポートするためにデータ型 (​dw::core::Types​) モジュールが導入されています。この新しいモジュールには多数の関数と新しいデータ方が含まれます。詳細は、​「データ型 (dw::core::Types)」​を参照してください。

DataWeave では、既存のモジュールの多数の新しい関数も導入されています。

  • コア​ (​dw::Core​) モジュール: entriesOf​、​keysOf​、​namesOf​、​valuesOf​。

  • 配列​ (​dw::core::Arrays​) モジュール: firstWith​。

  • オブジェクト​ (​dw::core::Objects​) モジュール: everyEntry​、​someEntry​、​takeWhile​。​dropWhile​ には、反復処理し、条件が true になるまで配列内の項目を無視する新しい関数も含まれます。

  • 文字列​ (​dw::core::Strings​) モジュール: withMaxSize​ により、特定の値の最大サイズを指定できます。サイズの上限を超えた値は切り捨てられます。サイズが制限より大きくない場合、値は同じままになります。

非推奨:
オブジェクトモジュールの ​entrySet​ 関数、​keySet​ 関数、​nameSet​ 関数、​valueSet​ 関数はこのリリースでは非推奨であり、コアモジュールの ​entriesOf​ 関数、​keysOf​ 関数、​namesOf​ 関数、​valuesOf​ 関数に置き換えられています。

Intersection (交差) 型

DataWeave では、​Intersection​ 型が導入されています。​Intersection​ 型は ​Object​ 型に追加されます。

Intersection (交差) 型の構文は次のとおりです。

TypeA & TypeB & ...

ドキュメントについては、​「Type System (データ型の体系)」​を参照してください。

エラーメッセージの解析に対する改善

エラーメッセージの解析で、トークンの欠落、不完全な定義などの一般的な問題がより正確に反映されるようになりました。この問題の解決方法に関するヒントと例も含まれています。

新しい DataWeave リーダーとライターのプロパティ

DataWeave では、サポートされる DataWeave 形式の新規および強化済みのリーダーとライターのプロパティが多数導入されています。

  • バイナリ (​application/octet-stream​) 形式: encoding

  • DataWeave (​application/dw​) 形式: onlyData​ ライタープロパティとすべてのリーダープロパティ (​externalResources​、​javaModule​、​onlyData​)

  • JSON (​application/json​) 形式: writeAttributes

  • XML (​application/xml​) 形式: escapeCR​ ライタープロパティといくつかのリーダープロパティ (​collectionPath​、​maxAttributeSize​、​optimizeFor​、​supportDtd​、​streaming​)

  • YAML (​application/yaml​) 形式: maxEntityCount​ リーダープロパティ

説明については、​「サポートされるデータ形式」​のこれらの形式へのリンクを参照してください。

コアコンポーネント

次のコアコンポーネントは機能強化され、新しい機能が追加されています。

  • Until Successful コンポーネント:
    Max Retries (​maxRetries​) と Milliseconds Between Retries (​millisBetweenRetries​) で、数値または数値に解決される式がサポートされるようになりました。

    詳細なドキュメントについては、​「Until Successful スコープ」​を参照してください。

  • Batch Aggregator コンポーネントでは ​preserveMimeTypes​ 属性が追加されています。
    集約されたレコードは、各レコードのペイロードが含まれる配列としてアグリゲーターに渡されます。ただし、デフォルトではそれらのペイロードに関連付けられている MIME タイプは保持されません。Batch Aggregator の ​preserveMimeTypes​ 属性を指定して、レコードの MIME タイプを保持できます。この変更により、JSON や XML など、構造化されたテキスト形式のペイロードからのレコードを処理するのが簡単になりました。

    詳細なドキュメントについては、​「Batch Step 処理の絞り込み」​を参照してください。

API ゲートウェイ

API ゲートウェイに ​disablePolicies​ アノテーションが含まれるようになりました。​true​ に設定することで、リクエスターへのポリシーの適用をブロックできます。

また、このリリースではバックオフメカニズムの強化やポリシーデプロイヤーメカニズムの機能強化など、弾力性に関する強化もいくつか導入されています。