オリジナル記事
An event-driven approach to Salesforce integration
2020年7月6日 | 所要時間8分
多くの資料(記事、チュートリアルなど)では、MuleSoftとSalesforceの統合について、MuleSoftが常にプロアクティブに通信を開始する役目であり、スケジュールなどにもとづいてCRMデータの挿入やプルを行うことを前提としたアプローチが紹介されています。
この記事の目的は、対象となる2つのプラットフォーム間の統合について別のアプローチを紹介することです。このアプローチの場合、MuleSoftはスケジュールされたリクエストや増分リクエストとしてではなく、Salesforceによって送信された新しいデータまたは変更されたデータを表す通知(イベント)によってトリガされ、よりリアクティブな方法で機能します。ここでは、当アプローチを実装するためのさまざまなパターンをご紹介します。
完全な通知:イベントとオブジェクトインスタンス
このパターンでは、SalesforceはMuleSoftが公開しているAPIをファイアアンドフォーゲットモードで呼び出します。この場合、オブジェクトの内容、オブジェクトが新規か変更されたかを示すヘッダー付きの本格的な通知が含まれます。さらに、オブジェクトインスタンスが作成または変更された時点での現在の状態も含まれます。
{ "object":"Product", "id":"ydkC1234byJ", "status":"Created", "payload":{ "name":"Luppi Olive Oil", "family":"Oil & Condiments", "code":"pc123456" } }
このパターンでは、オブジェクトインスタンスの現在の状態を照会するために、MuleSoftからSalesforceに戻るラウンドトリップが必要ありません。
シンプルな通知:イベントのみ
このパターンでは、SalesforceはMuleSoftが公開しているRESTful APIをファイアアンドフォーゲットモードで呼び出します。この場合、オブジェクトの内容を示す無駄のないシンプルな通知が含まれます。新規か変更されたかに加え、オブジェクトインスタンスIDも含まれます。
{ "object":"Product", "id":"ydkC1234byJ", "status":"Modified" }
前のパターンとは異なり、このパターンでは、オブジェクトインスタンスの現在の状態を(IDで)照会するために、MuleSoftからのラウンドトリップが必要となります。
実践編
現段階では、MuleSoftの実装面についてはこれ以上の説明や詳細は必要ないと思われますが、この記事の内容を踏まえると、Salesforceは絶対に必要です。
Salesforceでは、開発者はJavaに似たプログラミング言語であるApexを活用できます。Apexにより、Salesforceサーバーでのフローとトランザクションの制御ステートメントとAPIへのコールを実行できます。これは、Webサービス要求、およびオブジェクトのトリガから開始できます。
注:このようなクラスやトリガの作成と実行、および外部システムとの接続を許可するには、Salesforceでいくつかの特別な設定を行う必要があります。詳細については、Salesforce開発者Webサイトをご覧ください。
Salesforce Apexクラス
まず、商品挿入用と商品修正用の2つのApexクラスを作成してみましょう。商品挿入クラスはMuleSoft APIに完全な通知を行い、商品修正クラスは単純な通知を行います。Apexクラスは、Salesforceの開発者コンソールから作成できます。
global class ProductInserted { @future(callout=true) public static void notify(Id productId, String productName, String productFamily, String productCode) { //--- Generate JSON body ---// String json = '{"object":"Product", "status":"Created", '; json += '"id":"' + productId + '",'; json += '"payload": {'; json += '"name":"' + productName + '",'; json += '"family":"' + productFamily + '",'; json += '"code":"' + productCode + '"}'; //--- Fire HTTP request to API ---// Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('http://YOUR_API_SERVER/api/notifications'); request.setMethod('POST'); request.setBody(json); request.setHeader('Content-Type', 'application/json'); HttpResponse response = http.send(request); } }
global class ProductModified { @future(callout=true) public static void notify(Id productId) { //--- Generate JSON body ---// String json = '{"object":"Product", "status":"Modified", ' + '"id":"' + productId + '"}'; //--- Fire HTTP request to API ---// Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('http://YOUR_API_SERVER/api/notifications'); request.setMethod('POST'); request.setBody(json); request.setHeader('Content-Type', 'application/json'); HttpResponse response = http.send(request); } }
Salesforce Apexトリガ
Apexクラスを実装した後は、対応するApexトリガを実装する必要があります。これはSalesforceの開発者コンソールからも行えます。
trigger ProductInserted on Product2 (after insert) { ProductInserted.notify( Trigger.new[0].id, Trigger.new[0].Name, Trigger.new[0].Family, Trigger.new[0].ProductCode); } Product Modified Trigger trigger ProductModified on Product2 (after update) { ProductModified.notify(Trigger.new[0].id); }
MuleSoftの実装
次に、コンテキスト(およびプラットフォーム)をMuleSoftのAnypoint Platformに完全に切り替えて、MuleSoft側のソリューションの開発を開始します。この例を簡単にするために、APIとその詳細を完全に指定するのではなく、Design Centerで5つのフローを持つ単純なMuleアプリケーションを作成します。各フローがパズルを構成するピースとなっています。
このとおりです。SalesforceとMuleSoftの統合を実現する2つのパターンを、両プラットフォームの最適な機能を用いて実装した、完全なイベント駆動型ソリューションです。
SalesforceとMuleSoftの統合方法の詳細については、eブック『APIでSalesforce Customer 360の力を解き放つ』をダウンロードしてご確認ください。