+
+

ラボ 3: Anypiont MQ 及び Notification APIを通じた Order Fulfillment の更新をブロードキャスト

概要

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

module10 lab 3 pub sub

実装はいくつかのステップで構成されています:

  1. Anypointのクラウドメッセージングサービスを使用して、パブリッシュとサブスクライブのメッセージングパターンを構成します。

  2. Order Fulfillment APIフローを拡張して、AnyPoint MQに単一のSend Notificationメッセージを発行します。

  3. Exchange 2.0を利用して、Gmail/TwitterおよびSlackコネクタを再利用して、2つのNotificationサブスクライバを作成します。

  4. DataWeave を使用して、Notification API コール間のデータ変換を管理します。

  5. Anypoint StudioからプロセスAPIを含むMuleアプリを実行してテストします。

ステップ 1: Anypoint MQの設定

まず、パブリッシュとメッセージングのパターンを構築するために使用するAnypoint MQとそのもととなるキューまたはデスティネーションを設定します。 このインタラクションにパブリッシュとサブスクライブのパターンを使用することで、多くのサブスクライバに通知をブロードキャストすることができます (ここでは、SlackやGmail/Twitterのソーシャルチャネルを使用しています)。

  1. Anypoint Platform にサインインして、MQ を選択してみましょう。

    module10 lab3 anypoint mq
  2. 次に、パブリッシュとサブスクライブの通知パターンをサポートするために必要なキューデスティネーションを作成してみましょう。

  3. Sandbox 環境を選択します。

    module10 lab3 select env
  4. 右上隅の module10 lab3 add button ボタンを押して、QUEUEを選択 します。

    module10 lab3 anypoint mq queue
  5. 最初のキューのIDを <ユーザ名>-order-user-notification-queue とします。

  6. 他のすべてのフィールドはデフォルト値のまま、Create Queue を選択します。

  7. 2つ目のキューを作成し、<ユーザー名>-order-slack-notification-queue というIDを入力します。

  8. 他のすべてのフィールドはデフォルト値のまま、Create Queue を選択します。

    キューの定義は、この図のようになるはずです:

    module10 lab3 anypoint mq queue config
  9. 次に、キューへのメッセージの送受信を可能にするために、AnypointMQ Exchangeを設定する必要があります。

  10. 右上隅の module10 lab3 add button ボタンを押して、Exchangeを選択 します。

    module10 lab3 anypoint mq exchange
  11. Exchangeに <ユーザー名>-order-exchange というIDを入力して、先ほどのステップで作成した2つのキューをそれぞれ選択します。

    module10 lab3 anypoint mq exchange config
  12. Save Changes を選択します。

  13. Anypoint MQの最後の設定は、Client Appを作成することです。 クライアントアプリを設定することで、Anypoint MQホストにアプリケーションを安全に登録することができます。

  14. 左側のナビバーの Client Apps リンクを選択し、続いてページ右上の + を選択します。

    module10 lab3 anypoint mq client apps
  15. <username>-order-notifications とアプリケーションに名前をつけます。

  16. Save Changes を選択し、画面が更新されるまで数秒待つと、新しく作成されたクライアントアプリケーショ ンの登録が表示されます。 アプリケーションが正常に登録されると、Client IDとClient Secretが表示されます。

  17. ID とシークレットは、このラボの後半のステップで使用するため、 メモして おいてください。

module10 lab3 anypoint mq client app config

ステップ 2: プロセスAPIを拡張してAnypoint MQに通知イベントを公開

このステップでは、Scatter-Gatherに新しいブランチを作成し、メッセージを変換しAnypoint MQを使用して非同期でNotification APIを呼び出すための準備をします。

始める前に、Order Fulfillment flowが以下の図を反映していることを確認しておきましょう:

module10 lab 3 pub sub

Scatter-Gatherの後のフローを拡張して、Notificationメッセージを適切に仲介してAnyPoint MQにパブリッシュできるようにします。

次のステップでは、Exchange キューを介して送信するメッセージのexamplesを作成します。

  1. src/test/resources フォルダに移動し、右ボタンを押します。

  2. New → Folder を選択します。

    module10 lab3 new folder
  3. フォルダ名examples とします。

    module10 lab3 examples folder name
  4. src/test/resources/examples で、publish-message-example.json という名前の新しいファイルを作成します。

  5. 以下のテキストをコピーして貼り付けてください:

    {
    	"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
    		}
    	]
    }
  6. example ファイルを保存して閉じます。

  7. 次に、Anypoint MQ Componentをパレットに追加します。

    Anypoint MQ Connectorをインポートするには、Exchangeに移動する必要があります。

  8. パレットに移動し、 Search in Exchange を押します。

    module10 lab3 search exchange
  9. 検索ボックスに Anypoint と入力してください。

  10. Anypoint MQ コネクタを選択します。

  11. Add> ボタンを押します。

    Selected modules パネルにコネクタが表示されているはずです。

    module10 lab3 selected connector

    バージョン3.1.2以降であることを確認してください。

  12. Finish を押します。

    Connector パレット に Anypoint Connector が表示されているはずです。

    module10 lab3 anypoint mq module
  13. 最後の Transform Message コンポーネントを削除します。

  14. Anypoint MQパレットで、Scatter Gatherコンポーネントの後にPublishアイコンをドラッグ&ドロップします。

    module10 lab3 add publish
  15. Publishアイコンをクリックします。

  16. 新しいConnector Configurationを作成してAnypoint MQクライアントを構成します。

    ステップ1で作成したMQクライアントから Client IDClient Secret をコピーして貼り付けます。

    module10 lab3 mq connection config
  17. OK を押します。

  18. General セクションでは

    次の値を入力してください:

    • Destination : <username>-order-exchange

    • Body: #[payload]

    • Properties: None

    module10 lab3 mq config

    + ここでは、Anypoint MQを介して送信するメッセージをマッピングしていきます。

  19. module10 lab2 transform buttonボタンをクリックします。

  20. Define metadata リンクをクリックします。

    module10 lab3 define metadata

    新しいウィンドウが開きます。

  21. Add ボタンを押して新しいデータ型を作成します。

  22. publish_message_example という名前をつけて、create type を押してください。

  23. タイプのドロップダウンリストでJSONを選択します。

    module10 lab3 metadata

    入力する新しいフィールドが表示されます。

  24. ドロップダウンから example を選択し、パスとして examples/publish-message-example.json を記述します。

    ファイルに移動することもできます。

    module10 lab3 metadata selected
  25. Select を押します。

  26. プロジェクトを保存します。

    メタデータが設定されたので、引き続きBodyのマッピングを行います。

  27. User Definedウィンドウからpublish-message-exampleを選択します。

  28. 完了したら Select を押します。

    これで、出力されたデータセンスが確認できました。Publish コンポーネントに送信する新しいメッセージをマッピングする必要があります。

  29. 実際の変換を次のものに置き換えます:

    %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
    	}
    }
    module10 lab3 transform payload
  30. プロジェクトを保存します。

    入力ペイロードを失いたくないので、パブリッシュ出力を変数に保存します。

  31. Advanced設定に進みます。

  32. Outputセクションで、以下の値を設定します:

    • Target Variable: result

    • Target Value: #[payload]

      module10 lab3 target value

      最後に、レスポンスを生成します。

  33. Publishコンポーネントの後にTransformコンポーネントを追加します。

  34. 以下の dataweave スクリプトを使用して Transform を完成させます:

    %dw 2.0
    output application/json
    ---
    {
    	order_id: vars.order_id as Number,
    	username: payload."1".payload.name
    }

    これで、Anypoint MQに通知メッセージを発行するために必要なすべての手順が完了しました。 最終的なフローは以下のようになるはずです:

module10 lab 3 final flow

次のステップでは、キューに登録し、TwitterとSlackの両方のチャンネルで通知イベントをトリガーする2つの新しいフローを作成します。

ステップ 3: SlackとTwitterの通知サブスクライバーの新しいフローを作成

Order Fulfillment フローが発行する通知イベントをサブスクライブするために、Slack通知チャネルとGmail/Twitterチャネルの2つの新しいフローをMuleプロジェクト内に作成します。

それぞれのフローは、プロセスAPIから同じNotificationメッセージのコピーを送信し、これらのNotificationフローはメッセージを使用して、 あらかじめ構築されているNotification (System) APIの一部である設定済みのソーシャルエンドポイントを呼び出します。

  1. Notification フローをカプセル化するために、新しいMule Configuration fileを作成します。

    module10 lab 3 new mule config subscriber flows
  2. 新しい設定ファイルの名前を notification_subscribers.xml とします。

  3. 空白のキャンバス上に Subscriber Anypoint MQコンポーネントをドラッグして、Gmail/Twitterチャンネルを対象とした最初のフローの構築を開始します。

  4. フロー名を notification-user-listener に変更します。

  5. コンポーネントの名前を Twitter Notificaton Subscriber に変更します。

  6. Anypoint MQ Connector Configurationオブジェクトを再利用します。

  7. Generalセクションの下にあるQueueフィールドに、宛先を <ユーザー名>-order-user-notification-queue と設定します。

    設定は次のようになります:

    module10 lab 3 twitter notification flow
  8. saveボタンを押してください。

    受信するメッセージを定義します。これは、公開しているメッセージと同じとなります。

  9. Metadata タブに移動します。

    module10 lab3 subscriber metadata
  10. Add metadata ボタンを押します。

  11. Output: Payload を選択して、編集ボタンを押します。

    module10 lab3 subscriber metadata edit
  12. メタデータの publish_message_example を選択し、Select ボタンを押します。

    module10 lab3 suscriber select message

    これで、コンポーネントのメタデータが設定できました。Anypoint Studioでのデータセンスの管理しやすくなります。

    Notifications API を利用するので、コネクタを追加する必要があります。

  13. Search in Exchange に移動し、Notification API を検索します。

    module10 lab3 notification api module

    Finishを押すと、Notification API モジュールがパレットで使用できるようになります。

    module10 lab3 notification api palette

    コネクタのバージョンが変わることがありますが、最新のバージョンであることを確認してください。

  14. Create id by id リソースをドラッグ&ドロップでして作成します。

    module10 lab3 create by id resource
  15. コネクタをダブルクリックして、プロパティを表示します。Mule Properties View に設定するコンポーネントのプロパティが表示されます。

  16. module10 lab2 add button アイコンをクリックして、次のように新しい設定を作成します:

    module10 lab3 notification api config
  17. 下記の値を設定します。

    • Host: mythical-notification-api-v4-0.cloudhub.io

    • Port: 80

    • Base Path: /api

    • Protocol: HTTP

      ここではハードコーディングしていますが、 Host の値はconfiguration.yamlファイルで設定できるので、 ${system.api.host.notification}に変更することもできます。

      module10 lab3 notification api configuration
  18. OK クリックします。

  19. 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

      構成は次のようになります:

      module10 lab3 twitter notif config

      リクエストデータを完成させましょう。

  20. Create id by id request data項目の module10 lab2 transform button を押して、以下の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
    }

    次のように表示されます:

    module10 lab3 notification user dw
  21. 最後に Logger コンポーネントを追加します。これは、通知が送信されたことを示すログエントリを出力します。

  22. Messageには以下の文字列を入れます。 Notification to Twitter successfully Sent

    module10 lab 3 twitter notification logger

    フローは以下のようになります。

    module10 lab3 notification user listener final flow
  23. フローの設定を保存します。

このステップで設定する次のフローは、Slack Notification Flow になります。

  1. 別の Subscriber Anypoint MQ コンポーネントをキャンバスにドラッグします。これにより、新しいフローが作成されます。

  2. フローの名前を notification-slack-listener に変更します。

  3. コンポーネントの名前を Slack Notificaton Subscriber に変更します。

  4. Anypoint MQ Connector Configuration オブジェクトを再利用します。

  5. 宛先を <ユーザー名>-order-slack-notification-queue に構成します。

  6. 構成は、以下のイメージとなるはずです:

    module10 lab 3 slack notification anypoint mq
  7. Metadata タブに移動します。

  8. Add metadata ボタンを押します。

  9. Output: Payload を選択して、編集ボタンを押します。

  10. メタデータの publish_message_example を選択し、Select ボタンを押します。

    ここでも出力メタデータを設定しているので、Anypoint Studioがデータセンスを管理しやすくなります。

  11. Notification APIコネクタか らコンポーネント Create slack を追加します。

  12. すでに作成した Connector の設定を再利用します。

  13. General セクションで、次のパラメータを設定します。

    • Name: Expression Value

    • Create slack request data: #[payload]

    • Client id: 11def1b704e24d87a5ea5769772c90a7

    • Client secret: 88845E529f1F42E4a5aC96Fd504c3e01

    • Content type: application/json

    • Accept: application/json

      構成は次のようになります:

      module10 lab3 slack notif config

      リクエストデータを完成させましょう。

  14. module10 lab2 transform buttonを押して、以下のDataWeaveロジックをコードエディタに追加します。:

    %dw 2.0
    output application/json
    ---
    {
    	userId: payload.customer_data.id,
    	productList: payload.products map ( product , indexOfProduct ) -> {
    		qty: product.quantity,
    		name: product.productName
    	}
    }
    module10 lab3 notification slack dw

    module10 lab2 done buttonボタンを押します。

  15. 最後に Logger コンポーネントを追加します。これは、通知が送信されたことを示すログエントリを出力します。

  16. Messageには以下の文字列を入れます。Notification to Slack Successfully Sent

    ロガーの設定と最終的なフローは、以下のイメージのようになっているはずです:

    module10 lab 3 slack notification logger

    フローは以下のようになります。

    module10 lab3 slack transform step
  17. フロー設定を保存します。

ステップ 4: プロセスAPIを実行してOrder Fulfillment とAnypoint MQ通知をシミュレートする

Anypoint Studio でAPIを実行して、それがどのように連携して動作するかを確認してみましょう。

  1. 前のラボで行ったように、アプリケーションを起動します。(アプリケーションを右クリックし、Run AS > Mule Application を選択します。

  2. Anypoint Studioで API Console View を開いたら、/orders_fulfillment リソースの POST ボタンをクリックします。

  3. Accept フィールドに application/json を入力します。

  4. リクエストボディを確認し、SEND ボタンをクリックします。

    module10 lab2 api console post button fulfillment
  5. リクエストが送信されると、200 番のレスポンスコードと API の JSON レスポンスが表示されます。

  6. ブロードキャストされた通知メッセージを表示するには、インストラクターと一緒に GMail、Twitter、および/または Slack チャンネルを確認してください。

    module10 lab2 api console post success response

    Exchangeから完全なプロジェクトをダウンロードすることができます。

まとめ

このモジュールでは、以下の手順を完了しました:

  1. Anypoint Studioを使用して、Order Fulfillment Stubを実装してプロセスAPIレイヤーを完成させます。

  2. Scatter-Gatherフロー・コントロールとRAML Consumerオブジェクトを構成して、注文と顧客システムAPIをオーケストレーションします。

  3. DataWeaveを使用して、システムとAPIのレスポンスを管理し、目的の結果セットを生成します。

  4. RAMLコンシューマからのライブAPIコールを使用して、システムAPIレイヤーを横断するプロセスAPI実装をテストしました。

このラボで使用したコンポーネントの詳細については、以下のドキュメントを参照してください:

おめでとうございます!モジュール10の最後のラボ3を完了しました。

モジュール 11 に進んでください。

Submit your feedback!
Share your thoughts to help us build the best workshop experience for you!
Take our latest survey!