【Mule】Mule アプリケーション開発におけるリソースの共有化
はじめに
はじめまして。廣澤です。
CREFIL では Tech Leader というクラスで、技術的な面で他のメンバーを先導する立ち位置で働いています。
さて本日は私と同じような、チームを技術的に引っ張っていく開発リーダー向けの記事を書こうと思います。
具体的な内容は「Mule アプリケーション開発におけるリソースの共有化」についてです。
問題意識
Mule アプリケーションとは、MuleSoft 社が提供する Anypoint Platform 上で動作するアプリケーションのことです。
APIに特化したローコードで、Anypoint Studio という Eclipse に似た IDE 上で開発を行います。
Mule は「アプリケーション」という単位でビルドされ個別に動作を行うのですが、そこで問題が、、、
実は Mule、アプリケーションをクラウド上で動かす場合、アプリケーションを越えたリソースの共有化が標準でサポートされていません。
例えば次の画像のように「複数のアプリケーション (プログラム) で共通の設定ファイルを用意し、各アプリケーションがそれを参照する」ということをしたくても、そのやり方が公式のドキュメントには記載されていないのです。
公式サイトを見ると「Mule をオンプレミスにデプロイする場合は、デフォルトのエラーハンドラ、共有プロパティ、スケジューラプール、コネクタ設定などのグローバル設定を定義して、同じドメインにデプロイされたすべてのアプリケーションで共有できます。」と記載されてはいるのですが、クラウドにデプロイして動かす場合についての言及がありません。
https://docs.mulesoft.com/jp/mule-runtime/4.3/shared-resources
いやいやいや。
アプリケーション間でリソースを共有できないというのは手枷を付けられたまま開発を行わなければならないのと同義です。
例えばアプリケーションを跨いで共通のエラーメッセージを定義するようなことは普通に開発していれば往々に発生することで、それらを各アプリケーションにコピー&ペーストするのはできる限り避けたいことです。
これをどうにかできないかと模索してみました。
サンプルプログラム
解決方法を説明する前に、簡単なサンプルプログラムを用意しました。
まず src/main/resources に message-en.yaml と message-ja.yaml を用意しておき (画像左部赤枠)、それらにはファイルごとに英語のメッセージと日本語のメッセージを定義しておきます (画像右側、上部&中央部)。
プログラムの中ではエラー発生時に環境変数で指定された言語の yaml ファイルに定義されたメッセージを出力します (画像中央&右側下部)。
環境変数で message-ja.yaml を読むように指定した上でプログラムを動かすと、日本語のメッセージが表示されます。
さて、これらのエラーメッセージをアプリケーションを跨いだ共通リソースとするのが今回の記事の目標です。
解決方法
まず、Mule はどのようにデプロイされるかというと、ソースコードから作成される .jar ファイルをアップロードする形式でデプロイされます。
この jar ファイルはビルドすると作成されるのですが、実は単にビルド成果物を zip 化しただけのものです。
拡張子を以下のように zip にしてやって
解凍すると、中身のファイルを参照できます。
ここでは message-en.yaml と message-ja.yaml がそのままファイルに入っているのが分かります。
そこでリソース共有のためには、「ビルド時に message-en.yaml と message-ja.yaml を共通のものからコピーしてビルド時に一緒に入れ込んでやればいい」と考えました。
まず第1ステップとして、共有したいリソースを引っ越しさせます。
ここでは「global-resources」というフォルダを作成し、移動させます。
第2ステップとして pom.xml を書き換えます。
pom.xml は Maven というビルドツールを使う際の設定ファイルです。
※maven の概要については下記サイトが詳しいです。
https://www.techscore.com/tech/Java/ApacheJakarta/Maven/index/
Mule は Maven を利用しているため、これを書き換えます。
具体的には、ビルドの過程で global-resources 以下のファイルを持ってくるように、<build> の下に以下のように追記します。
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
<resource>
<directory>${project.basedir}/../global-resources</directory>
</resourc>
</resources>
これで通常の src/main/resources 以下のファイルだけでなく、global-resources 以下のファイルもリソースファイルとしてビルドに含めることができます。
この状態でビルドして動かしてみると、正しく動作していることを確認できます。
最後に
共通のフォルダを作成して、それをビルド時に含めるように pom.xml を書き換えただけですので簡単にリソースの共有ができました。
今回のサンプルは yaml ファイルを共有しただけでしたが、dwl ファイルも共有できますので、何度も使うような DataWeave をアプリケーションを跨いで共通化することも可能です。
実は可能ならば Mule Configuration File (通常のロジックを定義した XML ファイル) も共有したかったのですが、それはこの方法では叶いませんでした。
もし方法を知ってる方がいらっしゃれば、ぜひ記事を書いていただけると嬉しいです。
Mule は日本語で書かれた情報が少なくて検索するのがツラいので、みなさんと盛り上げていけたらと思います。