Salesforce の例 v10.2 - Mule 4

例: データの受け取りと変換

Mule フローは以下をセットアップします。

  • HTTP リスナー: HTTP 要求からデータを受け入れます。

  • メッセージの変換: データの構造と形式を変換し、Salesforce Connector が想定する出力を生成する。

  • Salesforce Connector:

    • (アウトバウンド) Salesforce に接続して、Salesforce にデータを転送する操作を実行します。

    • 設定に従ってフローをトリガーします。

    • Salesforce に接続して、クエリ結果を含む InputStream​ を返します。

  • メッセージの変換: データの構造と形式を変換して、File Connector エンドポイントが想定する出力を生成します。

  • File Connector: データをファイル (CSV など) に記録し、ユーザーが定義したディレクトリまたは場所に保存する。

Studio のフロー

  • HTTP リスナーをセットアップし、メッセージを変換して、アカウントを作成します。

    salesforce outbound
  • トリガーをスケジュールし、結果ストリームに対してクエリを実行し、メッセージを変換して、ファイルに書き込みます。

    salesforce inbound

XML フロー

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:file="http://www.mulesoft.org/schema/mule/file"
  xmlns:salesforce="http://www.mulesoft.org/schema/mule/salesforce"
  xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core"
  xmlns:http="http://www.mulesoft.org/schema/mule/http"
  xmlns="http://www.mulesoft.org/schema/mule/core"
  xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core
  http://www.mulesoft.org/schema/mule/core/current/mule.xsd
  http://www.mulesoft.org/schema/mule/http
  http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
  http://www.mulesoft.org/schema/mule/ee/core
  http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
  http://www.mulesoft.org/schema/mule/salesforce
  http://www.mulesoft.org/schema/mule/salesforce/current/mule-salesforce.xsd
  http://www.mulesoft.org/schema/mule/file
  http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd">
  <configuration-properties file="mule-app.properties"/>
  <http:listener-config name="HTTP_Listener_config"
   doc:name="HTTP Listener config" >
  <http:listener-connection host="localhost" port="8081" />
  </http:listener-config>
  <salesforce:sfdc-config name="Salesforce_Sfdc_config"
   doc:name="Salesforce SFDC config">
    <salesforce:basic-connection
    username="${salesforce.username}"
    password="${salesforce.password}"
    securityToken="${salesforce.securityToken}" />
  </salesforce:sfdc-config>
  <flow name="crud_app_template">
    <http:listener config-ref="HTTP_Listener_config"
     path="/" doc:name="Listener" />
    <parse-template location="form.html" doc:name="Parse Template"  />
  </flow>
  <flow name="create_accountFlow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/createAccount" doc:name="Listener"  />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[{

  Name: payload.Name,
  AccountNumber: payload.AccountNumber,
  BillingCity: payload.BillingCity
}]]]></ee:set-payload>
      </ee:message>
    </ee:transform>
    <salesforce:create doc:name="Create" type="Account"
     config-ref="Salesforce_Sfdc_config"/>
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload map {
  id:$.id,
  errors:$.errors,
  success:$.success

}]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="delete_accountFlow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/delete" doc:name="Listener"  />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[payload.Id]]]></ee:set-payload>
      </ee:message>
    </ee:transform>
    <salesforce:delete config-ref="Salesforce_Sfdc_config" doc:name="Delete" />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload map {
  id:$.id,
  errors:$.errors,
  success:$.success
}]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="query_accountFlow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/query" doc:name="Listener"  />
    <salesforce:query config-ref="Salesforce_Sfdc_config" doc:name="Query" >
      <salesforce:salesforce-query>
      SELECT AccountNumber,BillingAddress,Id,Name FROM Account WHERE Name = ':name'
      </salesforce:salesforce-query>
      <salesforce:parameters ><![CDATA[#[output application/java
---
{
  name : payload.name
}]]]></salesforce:parameters>
    </salesforce:query>
    <ee:transform doc:name="Transform Message"  >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload map {
    AccountNumber:$.AccountNumber,
    BillingAddress:$.BillingAddress,
    Id:$.Id,
    Name:$.Name
}]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="update_accountFlow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/update" doc:name="Listener"  />
    <ee:transform doc:name="Transform Message"  >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[{

  Name: payload.Name,
  AccountNumber: payload.AccountNumber,
  Id:payload.Id
}]]]></ee:set-payload>
      </ee:message>
    </ee:transform>
    <salesforce:update config-ref="Salesforce_Sfdc_config"
     type="Account" doc:name="Update"  />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload map {
  id:$.id,
  errors:$.errors,
  success:$.success
}]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="upsert_accountFlow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/upsert" doc:name="Listener" />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[{

  Name: payload.Name,
  AccountNumber: payload.AccountNumber,
  Id:payload.Id
}]]]></ee:set-payload>
      </ee:message>
    </ee:transform>
    <salesforce:upsert config-ref="Salesforce_Sfdc_config"
    externalIdFieldName="Id" type="Account" doc:name="Upsert" />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload map {
  id:$.id,
  errors:$.errors,
  success:$.success,
  created:$.created

  }]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="find_duplicates_for_account_flow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/findDuplicates" doc:name="Listener" />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[
  payload
]]]></ee:set-payload>
      </ee:message>
    </ee:transform>
    <salesforce:find-duplicates config-ref="Salesforce_Sfdc_config"
     type="Account"
    doc:name="Find duplicates" />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
  success: payload.success,
  duplicateResults: {
    (payload.duplicateResults map {
      matchRecords: $.matchResults
    }
    )
  },
  duplicateRuleEntityType: payload.duplicateRuleEntityType,
  duplicateRule: payload.duplicateRule,
  allowSave: payload.allowSave,
  errorMessage: payload.errorMessage
}]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="crud-appFlow" >
    <http:listener doc:name="Listener"
     config-ref="HTTP_Listener_config" path="/"/>
    <salesforce:convert-lead doc:name="Convert lead"
     config-ref="Salesforce_Sfdc_config"/>
  </flow>
</mule>

例: 親子リレーションのあるオブジェクトの作成または更新

Salesforce オブジェクトは、オブジェクト間で標準リレーションまたはカスタムリレーションを持つことができます。

オブジェクト間のリレーションは通常一対多の親-子リレーションですが、Salesforce に存在する 2 つのオブジェクトをどのような形でも結び付けることができます。

リレーションが設定されたオブジェクトを作成または変更するのは厄介です。このセクションでは、Salesforce Connector を使用してオブジェクトの更新/挿入を実行する方法を示します。

Salesforce にこのリレーションの構造を作成します。

この例では、MyCustomObject​ と MyOtherCustomObject​ の 2 つのカスタム種別を想定しています。

MyCustomObject は MyOtherCustomObject とのリレーションを維持する必要があります。MyCustomObject​ を更新/挿入すると、Salesforce Connector に入力として送信される POJO は次のようになります。

{
  ...
  // MyCustomObject's fields ...
  OtherObject__r:
  {
    CustomField__c : 'ABC123',
    type: 'MyOtherCustomObject__c'
  }
}

OtherObject​ は、MyCustomObject​ 項目の名前で、この値が MyOtherCustomObject​オブジェクトへの参照である必要があります。OtherObject__r​ は、設定され、別のオブジェクトへのリレーションである項目の名前を示します。

この項目の値は、2 つの項目が設定されたオブジェクトである必要があります。

1 つは、種別の名前の項目で、参照先のオブジェクト種別の名前が値になります。この場合の種別は MyOtherCustomObject​ です。

もう 1 つは、参照する MyOtherCustomObject​ の適正なインスタンスを識別するのに適した値と名前の項目です。この場合は、ABC123​ という値がある CustomField​ という項目です。

次の XML の例は、これらのオブジェクトを更新する方法を示しています。

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata"
    xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking"
    xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw"
    xmlns:sfdc="http://www.mulesoft.org/schema/mule/sfdc"
    xmlns="http://www.mulesoft.org/schema/mule/core"
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
  xmlns:spring="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/sfdc
http://www.mulesoft.org/schema/mule/sfdc/current/mule-sfdc.xsd
http://www.mulesoft.org/schema/mule/ee/dw
http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd
http://www.mulesoft.org/schema/mule/core
http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ee/tracking
http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd">
    <sfdc:config name="Salesforce__Basic_Authentication"
        username="username"
        password="password"
        securityToken="token"
        url="https://test.salesforce.com/services/Soap/u/34.0"
        doc:name="Salesforce: Basic Authentication"/>
    <flow name="DirectUpsert" initialState="stopped">
        <poll doc:name="Poll">
            <fixed-frequency-scheduler frequency="10000" startDelay="5000"/>
            <set-payload
                value="#[ [ ['Name' :'test'+server.dateTime, 'field_1__c' : 'test', 'OtherObject__r' : ['CustomField__c' : 'customFieldValue', 'type': 'MyOtherCustomObject__c'] ] ] ]"
                doc:name="Set Payload"/>
        </poll>

<sfdc:upsert config-ref="Salesforce__Basic_Authentication" externalIdFieldName="Id"
    type="MyCustomObject__c" doc:name="Salesforce">
<sfdc:objects ref="#[payload]"/>
</sfdc:upsert>
        <logger message="Upsert completed!" level="INFO" doc:name="Logger"/>
    </flow>
    <flow name="TransformBefore" initialState="stopped">
        <poll doc:name="Poll">
            <fixed-frequency-scheduler frequency="10000" startDelay="5000"/>
            <set-payload
                value="#[ {'name' :&quot;Paul&quot;, 'customData' : 'JULY 11TH', 'parentRef':  'Carlos' } ]"
                doc:name="Set Payload"/>
        </poll>
        <dw:transform-message metadata:id="7f3eb56a-b4ee-49db-8722-8b303c1c8e7a"
            doc:name="Transform Message">
            <dw:input-payload doc:sample="Input.dwl"/>
            <dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
[{
  Name: payload.name,
  field_1__c: payload.customData,
  OtherObject__r: {'CustomField__c' : payload.parentRef, 'type': 'MyOtherCustomObject__c'}
}]]]></dw:set-payload>
        </dw:transform-message>
        <sfdc:upsert config-ref="Salesforce__Basic_Authentication"
            externalIdFieldName="Id" type="MyCustomObject__c" doc:name="Salesforce">
            <sfdc:objects ref="#[payload]"/>
        </sfdc:upsert>
        <logger message="#[payload[0].created ? &quot;Created&quot; : &quot;Updated&quot;]"
         level="INFO" doc:name="Logger"/>
    </flow>
</mule>