
ラボ 3: Anypiont MQ 及び Notification APIを通じた Order Fulfillment の更新をブロードキャスト
概要
Order Fulfillment APIが呼び出されたときに、システム APIとして公開されている複数のチャネルにまたがって通知イベントをブロードキャストしたいと考えています。 Anypointのビルトイン・メッセージ・キューイング・システムを使用して、通知ブロードキャストを有効にするために必要なone-way, publish 及び subscribe機能を提供します。 2つの追加フローを作成します。それぞれのフローでは、Exchange の事前構築済み Notification API を活用して、迅速に Notification フローを構築します。

実装はいくつかのステップで構成されています:
-
Anypointのクラウドメッセージングサービスを使用して、パブリッシュとサブスクライブのメッセージングパターンを構成します。
-
Order Fulfillment APIフローを拡張して、AnyPoint MQに単一のSend Notificationメッセージを発行します。
-
Exchange 2.0を利用して、Gmail/TwitterおよびSlackコネクタを再利用して、2つのNotificationサブスクライバを作成します。
-
DataWeave を使用して、Notification API コール間のデータ変換を管理します。
-
Anypoint StudioからプロセスAPIを含むMuleアプリを実行してテストします。
ステップ 1: Anypoint MQの設定
まず、パブリッシュとメッセージングのパターンを構築するために使用するAnypoint MQとそのもととなるキューまたはデスティネーションを設定します。 このインタラクションにパブリッシュとサブスクライブのパターンを使用することで、多くのサブスクライバに通知をブロードキャストすることができます (ここでは、SlackやGmail/Twitterのソーシャルチャネルを使用しています)。
-
Anypoint Platform にサインインして、MQ を選択してみましょう。
-
次に、パブリッシュとサブスクライブの通知パターンをサポートするために必要なキューデスティネーションを作成してみましょう。
-
Sandbox 環境を選択します。
-
右上隅の
ボタンを押して、QUEUEを選択 します。
-
最初のキューのIDを <ユーザ名>-order-user-notification-queue とします。
-
他のすべてのフィールドはデフォルト値のまま、Create Queue を選択します。
-
2つ目のキューを作成し、<ユーザー名>-order-slack-notification-queue というIDを入力します。
-
他のすべてのフィールドはデフォルト値のまま、Create Queue を選択します。
キューの定義は、この図のようになるはずです:
-
次に、キューへのメッセージの送受信を可能にするために、AnypointMQ Exchangeを設定する必要があります。
-
右上隅の
ボタンを押して、Exchangeを選択 します。
-
Exchangeに <ユーザー名>-order-exchange というIDを入力して、先ほどのステップで作成した2つのキューをそれぞれ選択します。
-
Save Changes を選択します。
-
Anypoint MQの最後の設定は、Client Appを作成することです。 クライアントアプリを設定することで、Anypoint MQホストにアプリケーションを安全に登録することができます。
-
左側のナビバーの Client Apps リンクを選択し、続いてページ右上の + を選択します。
-
<username>-order-notifications とアプリケーションに名前をつけます。
-
Save Changes を選択し、画面が更新されるまで数秒待つと、新しく作成されたクライアントアプリケーショ ンの登録が表示されます。 アプリケーションが正常に登録されると、Client IDとClient Secretが表示されます。
-
ID とシークレットは、このラボの後半のステップで使用するため、 メモして おいてください。

ステップ 2: プロセスAPIを拡張してAnypoint MQに通知イベントを公開
このステップでは、Scatter-Gatherに新しいブランチを作成し、メッセージを変換しAnypoint MQを使用して非同期でNotification APIを呼び出すための準備をします。
始める前に、Order Fulfillment flowが以下の図を反映していることを確認しておきましょう:

Scatter-Gatherの後のフローを拡張して、Notificationメッセージを適切に仲介してAnyPoint MQにパブリッシュできるようにします。
次のステップでは、Exchange キューを介して送信するメッセージのexamplesを作成します。
-
src/test/resources フォルダに移動し、右ボタンを押します。
-
New → Folder を選択します。
-
フォルダ名 を
examples
とします。 -
src/test/resources/examples で、
publish-message-example.json
という名前の新しいファイルを作成します。 -
以下のテキストをコピーして貼り付けてください:
{ "order_id":"1", "customer_data":{ "id": "b4285d5f-69c1-40fc-97b3-d112a6366b68", "email": "test_email123@example.com", "name": "Mike Prowl", "phone": "1-(951)768-8479", "shippingAddress": { "address1": null, "city": "Houston", "country": "USA", "postalCode": "77045", "state": "Texas" }, "billingAddress": { "address1": null, "city": "Riverside", "country": "USA", "postalCode": "92513", "state": "California" } }, "products":[ { "id": 3, "productName": "Hoodie", "quantity": 1 }, { "id": 5, "productName": "Mug", "quantity": 2 } ] }
-
example ファイルを保存して閉じます。
-
次に、Anypoint MQ Componentをパレットに追加します。
Anypoint MQ Connectorをインポートするには、Exchangeに移動する必要があります。
-
パレットに移動し、 Search in Exchange を押します。
-
検索ボックスに
Anypoint
と入力してください。 -
Anypoint MQ コネクタを選択します。
-
Add> ボタンを押します。
Selected modules パネルにコネクタが表示されているはずです。
バージョン3.1.2以降であることを確認してください。
-
Finish を押します。
Connector パレット に Anypoint Connector が表示されているはずです。
-
最後の Transform Message コンポーネントを削除します。
-
Anypoint MQパレットで、Scatter Gatherコンポーネントの後にPublishアイコンをドラッグ&ドロップします。
-
Publishアイコンをクリックします。
-
新しいConnector Configurationを作成してAnypoint MQクライアントを構成します。
ステップ1で作成したMQクライアントから Client ID と Client Secret をコピーして貼り付けます。
-
OK を押します。
-
General セクションでは
次の値を入力してください:
-
Destination : <username>-order-exchange
-
Body: #[payload]
-
Properties: None
+ ここでは、Anypoint MQを介して送信するメッセージをマッピングしていきます。
-
-
ボタンをクリックします。
-
Define metadata リンクをクリックします。
新しいウィンドウが開きます。
-
Add ボタンを押して新しいデータ型を作成します。
-
publish_message_example
という名前をつけて、create type を押してください。 -
タイプのドロップダウンリストでJSONを選択します。
入力する新しいフィールドが表示されます。
-
ドロップダウンから
example
を選択し、パスとしてexamples/publish-message-example.json
を記述します。ファイルに移動することもできます。
-
Select を押します。
-
プロジェクトを保存します。
メタデータが設定されたので、引き続きBodyのマッピングを行います。
-
User Definedウィンドウからpublish-message-exampleを選択します。
-
完了したら Select を押します。
これで、出力されたデータセンスが確認できました。Publish コンポーネントに送信する新しいメッセージをマッピングする必要があります。
-
実際の変換を次のものに置き換えます:
%dw 2.0 output application/json --- { order_id: vars.order_id as Number, customer_data: { id: payload."1".payload.id, email: payload."1".payload.email, name: payload."1".payload.name, phone: payload."1".payload.phone, shippingAddress: { address1: payload."1".payload.shippingAddress.text, city: payload."1".payload.shippingAddress.city, country: payload."1".payload.shippingAddress.country, postalCode: payload."1".payload.shippingAddress.postalCode, state: payload."1".payload.shippingAddress.state }, billingAddress: { address1: payload."1".payload.billingAddress.text, city: payload."1".payload.billingAddress.city, country: payload."1".payload.billingAddress.country, postalCode: payload."1".payload.billingAddress.postalCode, state: payload."1".payload.billingAddress.state } }, products: payload."0".payload.products map ( orderLineItem , indexOfOrderLineItem ) -> { id: orderLineItem.id as Number, productName: orderLineItem.productName as String, quantity: orderLineItem.quantity as Number } }
-
プロジェクトを保存します。
入力ペイロードを失いたくないので、パブリッシュ出力を変数に保存します。
-
Advanced設定に進みます。
-
Outputセクションで、以下の値を設定します:
-
Target Variable:
result
-
Target Value:
#[payload]
最後に、レスポンスを生成します。
-
-
Publishコンポーネントの後にTransformコンポーネントを追加します。
-
以下の dataweave スクリプトを使用して Transform を完成させます:
%dw 2.0 output application/json --- { order_id: vars.order_id as Number, username: payload."1".payload.name }
これで、Anypoint MQに通知メッセージを発行するために必要なすべての手順が完了しました。 最終的なフローは以下のようになるはずです:

次のステップでは、キューに登録し、TwitterとSlackの両方のチャンネルで通知イベントをトリガーする2つの新しいフローを作成します。
ステップ 3: SlackとTwitterの通知サブスクライバーの新しいフローを作成
Order Fulfillment フローが発行する通知イベントをサブスクライブするために、Slack通知チャネルとGmail/Twitterチャネルの2つの新しいフローをMuleプロジェクト内に作成します。
それぞれのフローは、プロセスAPIから同じNotificationメッセージのコピーを送信し、これらのNotificationフローはメッセージを使用して、 あらかじめ構築されているNotification (System) APIの一部である設定済みのソーシャルエンドポイントを呼び出します。
-
Notification フローをカプセル化するために、新しいMule Configuration fileを作成します。
-
新しい設定ファイルの名前を notification_subscribers.xml とします。
-
空白のキャンバス上に Subscriber Anypoint MQコンポーネントをドラッグして、Gmail/Twitterチャンネルを対象とした最初のフローの構築を開始します。
-
フロー名を notification-user-listener に変更します。
-
コンポーネントの名前を Twitter Notificaton Subscriber に変更します。
-
Anypoint MQ Connector Configurationオブジェクトを再利用します。
-
Generalセクションの下にあるQueueフィールドに、宛先を <ユーザー名>-order-user-notification-queue と設定します。
設定は次のようになります:
-
saveボタンを押してください。
受信するメッセージを定義します。これは、公開しているメッセージと同じとなります。
-
Metadata タブに移動します。
-
Add metadata ボタンを押します。
-
Output: Payload を選択して、編集ボタンを押します。
-
メタデータの publish_message_example を選択し、Select ボタンを押します。
これで、コンポーネントのメタデータが設定できました。Anypoint Studioでのデータセンスの管理しやすくなります。
Notifications API を利用するので、コネクタを追加する必要があります。
-
Search in Exchange に移動し、Notification API を検索します。
Finishを押すと、Notification API モジュールがパレットで使用できるようになります。
コネクタのバージョンが変わることがありますが、最新のバージョンであることを確認してください。
-
Create id by id リソースをドラッグ&ドロップでして作成します。
-
コネクタをダブルクリックして、プロパティを表示します。Mule Properties View に設定するコンポーネントのプロパティが表示されます。
-
アイコンをクリックして、次のように新しい設定を作成します:
-
下記の値を設定します。
-
Host:
mythical-notification-api-v4-0.cloudhub.io
-
Port:
80
-
Base Path:
/api
-
Protocol:
HTTP
ここではハードコーディングしていますが、 Host の値はconfiguration.yamlファイルで設定できるので、 ${system.api.host.notification}に変更することもできます。
-
-
OK クリックします。
-
General セクションでは、以下のパラメータを設定します:
-
Id:
#[payload.customer_data.id]
-
Create id by id request data:
#[payload]
-
Client id:
11def1b704e24d87a5ea5769772c90a7
-
Client secret:
88845E529f1F42E4a5aC96Fd504c3e01
-
Content type:
application/json
-
Accept:
application/json
構成は次のようになります:
リクエストデータを完成させましょう。
-
-
Create id by id request data項目の
を押して、以下のDataWeaveロジックをコードエディタに追加します:
%dw 2.0 output application/java var customer=payload.customer_data.name default "" var order_id=payload.order_id default 0 --- { body: "Thank you " ++ customer ++ ", your order (#" ++ order_id ++ ") has been received.", subject: "Order " ++ order_id }
次のように表示されます:
-
最後に Logger コンポーネントを追加します。これは、通知が送信されたことを示すログエントリを出力します。
-
Messageには以下の文字列を入れます。
Notification to Twitter successfully Sent
フローは以下のようになります。
-
フローの設定を保存します。
このステップで設定する次のフローは、Slack Notification Flow になります。
-
別の Subscriber Anypoint MQ コンポーネントをキャンバスにドラッグします。これにより、新しいフローが作成されます。
-
フローの名前を
notification-slack-listener
に変更します。 -
コンポーネントの名前を Slack Notificaton Subscriber に変更します。
-
Anypoint MQ Connector Configuration オブジェクトを再利用します。
-
宛先を <ユーザー名>-order-slack-notification-queue に構成します。
-
構成は、以下のイメージとなるはずです:
-
Metadata タブに移動します。
-
Add metadata ボタンを押します。
-
Output: Payload を選択して、編集ボタンを押します。
-
メタデータの publish_message_example を選択し、Select ボタンを押します。
ここでも出力メタデータを設定しているので、Anypoint Studioがデータセンスを管理しやすくなります。
-
Notification APIコネクタか らコンポーネント Create slack を追加します。
-
すでに作成した Connector の設定を再利用します。
-
General セクションで、次のパラメータを設定します。
-
Name: Expression Value
-
Create slack request data: #[payload]
-
Client id:
11def1b704e24d87a5ea5769772c90a7
-
Client secret:
88845E529f1F42E4a5aC96Fd504c3e01
-
Content type:
application/json
-
Accept:
application/json
構成は次のようになります:
リクエストデータを完成させましょう。
-
-
を押して、以下のDataWeaveロジックをコードエディタに追加します。:
%dw 2.0 output application/json --- { userId: payload.customer_data.id, productList: payload.products map ( product , indexOfProduct ) -> { qty: product.quantity, name: product.productName } }
ボタンを押します。
-
最後に Logger コンポーネントを追加します。これは、通知が送信されたことを示すログエントリを出力します。
-
Messageには以下の文字列を入れます。
Notification to Slack Successfully Sent
ロガーの設定と最終的なフローは、以下のイメージのようになっているはずです:
フローは以下のようになります。
-
フロー設定を保存します。
ステップ 4: プロセスAPIを実行してOrder Fulfillment とAnypoint MQ通知をシミュレートする
Anypoint Studio でAPIを実行して、それがどのように連携して動作するかを確認してみましょう。
-
前のラボで行ったように、アプリケーションを起動します。(アプリケーションを右クリックし、Run AS > Mule Application を選択します。
-
Anypoint Studioで API Console View を開いたら、/orders_fulfillment リソースの POST ボタンをクリックします。
-
Accept フィールドに
application/json
を入力します。 -
リクエストボディを確認し、SEND ボタンをクリックします。
-
リクエストが送信されると、200 番のレスポンスコードと API の JSON レスポンスが表示されます。
-
ブロードキャストされた通知メッセージを表示するには、インストラクターと一緒に GMail、Twitter、および/または Slack チャンネルを確認してください。
Exchangeから完全なプロジェクトをダウンロードすることができます。
まとめ
このモジュールでは、以下の手順を完了しました:
-
Anypoint Studioを使用して、Order Fulfillment Stubを実装してプロセスAPIレイヤーを完成させます。
-
Scatter-Gatherフロー・コントロールとRAML Consumerオブジェクトを構成して、注文と顧客システムAPIをオーケストレーションします。
-
DataWeaveを使用して、システムとAPIのレスポンスを管理し、目的の結果セットを生成します。
-
RAMLコンシューマからのライブAPIコールを使用して、システムAPIレイヤーを横断するプロセスAPI実装をテストしました。
このラボで使用したコンポーネントの詳細については、以下のドキュメントを参照してください:
-
詳細については、 Rest Connectors を参照してください。
-
詳細については、 Scatter-Gatherルータ を参照してください。
-
詳細については、 Anypoint MQ を参照してください。
おめでとうございます!モジュール10の最後のラボ3を完了しました。
モジュール 11 に進んでください。