ESB Mule ESBを始めよう
1概要
ESB
は、軽量のJavaベースのエンタープライズサービスバスです。それは開発者が異なるフォーマットのデータを交換することによって一緒に複数のアプリケーションを接続することを可能にします。メッセージの形式でデータを運びます。
ESBは、次のような多数のサービスを提供することによって強力な機能を提供します。
-
サービスの作成とホスティング
-
サービス調停
-
メッセージルーティング
-
データ変換
ESBは、複数のアプリケーションを統合する必要がある場合、または将来さらにアプリケーションを追加するという考え方がある場合に役立ちます。
ESBは、複数の種類の通信プロトコルを扱う場合や、メッセージルーティング機能が必要な場合にも使用されます。
こちら
から入手できる
AnyPoint Studio
を使用して、セクション5でサンプルプロジェクトを作成しましょう。
2.
ESB Muleメッセージの構造
簡単に言うと、ESBの主な目的はサービス間の仲介とさまざまなエンドポイントへのメッセージのルーティングです。そのため、さまざまな種類のコンテンツまたはペイロードを処理する必要があります。
メッセージ構造は2つの部分に分けられます。
-
メッセージヘッダ
–
メッセージメタデータを含む -
メッセージペイロード – ビジネス固有のデータが含まれています
-
メッセージはメッセージオブジェクトに埋め込まれています** メッセージオブジェクトはコンテキストから取得できます。 ESB Muleフロー内のカスタムJavaコンポーネントとトランスフォーマーを使ってそのプロパティとペイロードを変更できます。
各アプリケーションは1つ以上のフローで構成されています。
フローでは、コンポーネントを使用してメッセージとそのさまざまなプロパティにアクセスしたり、フィルタをかけたり、変更したりできます。
たとえば、Javaコンポーネントを使用してメッセージのインスタンスを取得できます。このコンポーネントクラスは
org.mule.api.lifecycle
パッケージの
Callable
インターフェースを実装しています。
public Object onCall(MuleEventContext eventContext) throws Exception {
MuleMessage message = eventContext.getMessage();
message.setPayload("Message payload is changed here.");
return message;
}
3プロパティと変数
メッセージのメタデータはプロパティで構成されています。変数はメッセージに関するデータを表します。プロパティと変数がメッセージのライフサイクル全体にどのように適用されるかは、それらの範囲によって定義されます。プロパティには、範囲に基づいて2つのタイプがあります。インバウンドとアウトバウンドです。
-
インバウンドプロパティ** は、フローを横断する間にメッセージがスクランブルされるのを防ぐメタデータを含みます。受信プロパティは不変であり、ユーザーが変更することはできません。メッセージがフローを終了すると、インバウンドプロパティは存在しなくなります。
-
アウトバウンドプロパティ** はESB Muleによって自動的に設定されるか、あるいはユーザはフロー設定を通してそれらを設定することができます。これらの特性は変更可能です。メッセージがトランスポートバリアを通過した後に別のフローに入ると、これらはインバウンドプロパティになります。
それぞれのスコープ内で関連するsetterメソッドとgetterメソッドを呼び出すことで、それぞれ送信プロパティと受信プロパティを設定および取得できます。
message.setProperty(
"outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND);
String inboundProp = (String) message.getInboundProperty("outboundKey");
アプリケーションで宣言できる変数は2種類あります。
1つはESB Muleフローに対してローカルで、フロー、サブフロー、プライベートフローで利用可能なフロー変数です。
一度宣言されたセッション変数は、アプリケーション全体で使用可能になります。
4輸送障壁と
flow-ref
トランスポートバリアは、HTTPコネクタ、VM、JMS、またはメッセージをルーティングするためのパスまたはエンドポイントを必要とする類似のコネクタです。
フロー変数は輸送障壁を越えて利用できませんが、セッション変数はすべてのフローでプロジェクト全体で利用できます。
サブフローまたはプライベートフローを作成する必要があるときは、
flow-ref
コンポーネントを使用して、親または別のフローからのフローを参照できます。 ** フロー変数とセッション変数の両方が、
flow-ref
を使用して参照されるサブフローとプライベートフローで使用できます。
** 5プロジェクト例
Anypoint Studioで、受信コネクタと送信コネクタを介して相互に通信する複数のフローを含むアプリケーションを作成しましょう。
最初の流れを見てみましょう。
リンク:/uploads/Flow-300×90.jpg[]
HTTPリスナーを次のように設定できます。
<http:listener-config name="HTTP__Listener__Configuration"
host="localhost" port="8081" doc:name="HTTP Listener Configuration"/>
フローコンポーネントは
<flow>
タグの内側になければなりません。そのため、複数のコンポーネントを含むフローの例は次のとおりです。
<flow name="Flow">
<http:listener
config-ref="HTTP__Listener__Configuration"
path="/" doc:name="HTTP"
allowedMethods="POST"/>
<logger message="Original
paylaod: #[payload]"
level="INFO" doc:name="Logger"/>
<custom-transformer
class="com.baeldung.transformer.InitializationTransformer"
doc:name="Java"/>
<logger message="Payload After Initialization: #[payload]"
level="INFO" doc:name="Logger"/>
<set-variable variableName="f1"
value="#['Flow Variable 1']" doc:name="F1"/>
<set-session-variable variableName="s1"
value="#['Session variable 1']" doc:name="S1"/>
<vm:outbound-endpoint exchange-pattern="request-response"
path="test" doc:name="VM"/>
</flow>
フロー内では、設定済みのHTTPリスナーへの参照を提供しています。その後、HTTPリスナーがPOSTメソッドを介して受信しているペイロードを記録するロガーを保持しています。
その後、メッセージを受信した後にペイロードを変換するカスタムJavaトランスフォーマクラスが配置されます。
public Object transformMessage(
MuleMessage message,
String outputEncoding) throws TransformerException {
message.setPayload("Payload is transferred here.");
message.setProperty(
"outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND);
return message;
}
-
トランスフォーマクラスは
AbstractMessageTransformer ** .を拡張する必要があります。また、クラス内にアウトバウンドプロパティも設定します。
これで、すでにメッセージオブジェクト内のペイロードを変換し、それをloggerを使ってコンソールに記録しました。フロー変数とセッション変数を設定します。
最後に、発信VMコネクタを介してペイロードを送信しています。 ** VMコネクタ内のパスによって受信エンドポイントが決まります。
リンク:/uploads/Flow1-300×91.jpg[]
初期フローによって伝送および変換されたメッセージは、インバウンドVMエンドポイントを介して
Flow1
に到達します。
Javaコンポーネントは最初のフローで設定されたアウトバウンドプロパティを取得し、メッセージペイロードになるオブジェクトを返します。このタスクの
transformMessage()
メソッド
public Object transformMessage(
MuleMessage message,
String outputEncoding) throws TransformerException {
return (String) message.getInboundProperty("outboundKey");
}
次に、フロー変数とセッション変数が2番目のフローに設定されます。その後、
flow-ref
コンポーネントを使用して
Flow2
への参照を取得しました。
リンク:/uploads/Flow2-300×125.jpg[]
Flow2では、Javaコンポーネントクラスを使用してメッセージを変換し、コンソールに記録しました。フロー変数
F3__も設定しました。
flow-refを使用して
Flow2
を呼び出した後、Flow1
はメッセージが
_Flow2
_
で処理されるのを待ちます。
-
Flow1
と
Flow2
に設定されたフロー変数は両方のフローで使用できます。これらのフローはトランスポートバリアによって分離されていないためです。
最後に、メッセージはVMを通じてHTTPリクエスタに返送されます。すべてのVMを要求 – 応答として構成しました。
本文にJSONデータを投稿することで、あらゆるRESTクライアントからこのアプリケーションを呼び出すことができます。 HTTPリスナーで設定されているとおり、URLは
localhost:8081
になります。
6. コマンドラインでMavenを使用してプロジェクトを構築する
Mavenのconfディレクトリにある
settings.xml
ファイルに、
pluginGroup
を含める必要があります。
<pluginGroups>
<pluginGroup>org.mule.tools</pluginGroup>
</pluginGroups>
また、Muleのリポジトリを見つける場所をMavenに指示する必要があります。これはprofileタグに含める必要があります。
<profile>
<id>Mule Org</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>mulesoft-releases</id>
<name>MuleSoft Repository</name>
<url>https://repository-master.mulesoft.org/releases/</url>
<layout>default</layout>
</repository>
<repository>
<id>mulesoft-snapshots</id>
<name>MuleSoft Snapshot Repository</name>
<url>https://repository-master.mulesoft.org/snapshots/</url>
<layout>default</layout>
</repository>
</repositories>
</profile>
これで、次のコマンドを使ってMavenプロジェクトを簡単に始めることができます。
mvn mule-project-archetype:create -DartifactId=muleesb -DmuleVersion=3.8.1
プロジェクトを設定したら、
mvn package
コマンドを使用してデプロイ可能なアーカイブを作成できます。これで、アーカイブを任意のスタンドアローンESB Muleサーバの
apps
フォルダに配置できます。
7.まとめ
この記事では、ESBアプリケーションとしてESBアプリケーションをMuleでビルドするために必要なさまざまな概念について説明しました。説明したすべての概念を示すサンプルプロジェクトを作成しました。
Anypoint Studioを使用してESBアプリケーションの作成を開始し、さまざまなニーズを満たすことができます。
いつものように、完全なプロジェクトはhttps://github.com/eugenp/tutorials/tree/master/muleesb[over on GitHub]にあります。