データの並列保存

logo cloud IDE Cloud IDE

logo desktop IDE Desktop IDE

これは進行中のベータリリースです。ベータ状態での Anypoint Code Builder の使用には、該当するベータサービス契約条件が適用されます。

Salesforce から取引先責任者レコードを取得しました。次に、レコードを更新する必要があるかどうかを決定するロジックを追加できます。更新する必要がある場合、保存された情報を新しい値で更新する必要があります。これを行うには、Scatter-Gather プロセッサーを使用して、Salesforce 組織と MySQL データベースの両方への要求を並列で実行する必要があります。

始める前に

次の手順を実行します。

Scatter-Gather を追加してデータを並列で保存する

  1. Anypoint Code Builder で ​contact-sync.xml​ ファイルを開きます。

  2. [Set Return Message (返すメッセージを設定)]​ Set Variable コンポーネントの後の ​​ (​[Add component (コンポーネントを追加)]​) アイコンをクリックします。

    add scatter gather canvas
  3. 「scatter」​と入力して ​[Scatter Gather]​ を選択します。

    scatter gather operation canvas
  4. Scatter-Gather コンポーネント内に次のロジックを追加します。

    <scatter-gather doc:name="SF and DB update">
        <route doc:name="SF Update">
    
        </route>
        <route doc:name="DB Update">
    
        </route>
    
    </scatter-gather>

Salesforce レコードの更新

最初に、Salesforce のレコードの更新が必要な場合にレコードを更新する手順を実装することができます。この目的では、次を定義する必要があります。

  • 更新が必要かどうかを決定するロジック

  • Salesforce Connector を使用してレコードを更新するために必要な操作

このチュートリアルの前半で、レコードから取得した電話番号を ​phonenumberSFVar​ という変数に保存しました。この変数を、​phonenumberVar​ という別の変数に保存されている、POST 要求のクエリパラメーターで受け取った値と比較できるようになりました。

POST 要求の電話番号と Salesforce から取得した番号を比較するには、Choice ルーターを DataWeave 式と共に追加して、Salesforce の既存の電話番号と新しい電話番号が同じかどうかを確認します。同じ場合、​[Phone number in Salesforce already up to date (Salesforce の電話番号はすでに最新)]​ というメッセージをログに記録し、Set Variable コンポーネントを追加して値 ​[Phone number in Salesforce already up to date]​ (Salesforce の電話番号はすでに最新) を変数 ​ReturnMessageSF​ に設定します。

  1. Anypoint Code Builder で ​contact-sync.xml​ ファイルを開きます。

  2. [SF Update (SF 更新)]​ ルートの後に Choice ルーターを追加します。

    <choice doc:name="Phone needs update?">
        <when doc:name="No Update needed" expression="#[vars.phonenumberSFVar == vars.phonenumberVar]">
            <logger doc:name="Logger" message='#["Phone number in Salesforce already up to date"]' />
            <set-variable value='#["Phone number in Salesforce already up to date. "]' doc:name="Set Return Message" variableName="ReturnMessageSF" />
        </when>
        <otherwise doc:name="Update needed" >
    
        </otherwise>
    </choice>
  3. <otherwise/>​ 要素に次を入力します。

    • 変数 ​IdVar​ および ​phonenumberVar​ を使用して電話番号を更新/挿入する Transform Message コンポーネント。

    • 成功した更新を記録して、値 ​[Phone number in Salesforce successfully updated]​ (Salesforce の電話番号が正常に更新されました) を ​ReturnMessageSF​ 変数に割り当てます。

      <ee:transform doc:name="SF update message">
      	<ee:message>
      		<ee:set-payload>
      			<![CDATA[%dw 2.0
      			output application/java
      			---
      			[{
      			Id: vars.IDVar,
      			Phone: vars.phonenumberVar
      			}]]]>
      		</ee:set-payload>
      	</ee:message>
      </ee:transform>
      <salesforce:update type="contact" config-ref="Salesforce_Config" doc:name="Update" />
      <logger doc:name="Logger" message='#["Phone number in Salesforce successfully updated"]' />

データベースレコードの更新

必要な場合に対象 MySQL データベースのレコードを更新する手順を実装するには、次を定義する必要があります。

  • 更新が必要かどうかを決定するロジック

  • Database Connector を使用してレコードを更新するために必要な操作

    1. Anypoint Code Builder で ​contact-sync.xml​ ファイルを開きます。

    2. db:select​ 操作を ​[DB Update (DB 更新)]​ ​route​ プロセッサーの下に追加し、​[Contacts (取引先責任者)]​ テーブルのすべての項目を選択して、取引先責任者の名と姓で絞り込みます。

      <db:select config-ref="Database_Config" doc:name="Select Contact from DB" >
           <db:sql>
               <![CDATA[SELECT * FROM Contacts WHERE FirstName = :firstname AND LastName = :lastname]]>
           </db:sql>
           <db:input-parameters>
      <![CDATA[#[{
      firstname: vars.firstnameVar,
      lastname: vars.lastnameVar
      }]]]>
           </db:input-parameters>
      </db:select>
      <logger doc:name="Logger" />
      db update scatter gather sync api
    3. Choice ルーターを使用して取引先責任者がデータベースにすでに存在しているかどうかを検出するロジックを追加します。

      <choice doc:name="Does Contact exist in DB?" doc:id="piomzk" >
          <when expression="#[payload.phoneNumber[0] == null]" doc:name="Contact does not exist" >
      
          </when>
      </choice>
      second choice router db update
    4. 取引先責任者はデータベースに存在しないため、Choice ルーターの ​[contact does not exist (取引先責任者が存在しない)]​ ​when​ 分岐を使用して、取引先責任者の詳細を含む新しい行を挿入し、必要に応じて ​ReturnMessageDB​ 変数を設定します。次のコードは手順の詳細を示しています。

      <db:insert config-ref="Database_Config" doc:name="Insert Contact in DB">
           <db:sql>
                 <![CDATA[INSERT INTO Contacts (FirstName, LastName, PhoneNumber) VALUES (:firstname, :lastname, :phone)]]>
           </db:sql>
           <db:input-parameters>
                <![CDATA[#[{
                firstname: vars.firstnameVar,
                lastname: vars.lastnameVar,
                phone: vars.phonenumberVar
                }]]]>
           </db:input-parameters>
      </db:insert>
      <logger level="INFO" message='#["Contact in database created"]' />
      <logger doc:name="Logger" message='#["Contact in database created"]' />
      <set-variable value='#["Contact in database created. "]' doc:name="Set ReturnMessageDB" variableName="ReturnMessageDB"/>
    5. レコードがデータベースに存在する場合、​otherwise​ 分岐を Choice ルーター内に作成して電話番号を抽出し、​phonenumberDBVar​ という変数に割り当てて、取引先責任者の電話番号を文字列としてキャストします。

      <otherwise doc:name="Contact exists in the DB" >
          <set-variable value="#[payload.phoneNumber[0] as String]" doc:name="Set phone in DB" doc:id="tkqxdt" variableName="phonenumberDBVar"/>
      </otherwise>
    6. 別の Choice ルーターを追加して、古い電話番号と新しい電話番号が同じかどうかを確認します。番号が同じ場合、必要に応じてログに記録して ​ReturnMessageDB​ を更新します。番号が同じではない場合、データベースの電話番号を更新し、ログに記録して ​ReturnVariableDB​ を更新します。

      次のコードサンプルを ​[Set phone in DB (DB の電話を設定)]​ ​set-variable​ コンポーネントの下に追加します。

      <choice doc:name="Does phone number need update">
           <when doc:name="Already up to date" expression="#[vars.phonenumberDBVar == vars.phonenumberVar]">
                <logger doc:name="Logger" message='#["Phone number in Database already up to date"]' />
                <set-variable doc:name="Set ReturnMessageDB" value='#["Phone number in Database already up to date. "]' variableName="ReturnMessageDB" />
           </when>
           <otherwise doc:name="Needs update" >
                <db:update config-ref="Database_Config" doc:name="Update phone number in DB">
                     <db:sql>
                         <![CDATA[UPDATE Contacts SET PhoneNumber = :Phone WHERE FirstName = :firstname AND LastName = :lastname]]>
                     </db:sql>
                     <db:input-parameters>
                          <![CDATA[#[{
                          firstname: vars.firstnameVar,
                          lastname: vars.lastnameVar,
                          Phone: vars.phonenumberVar
                          }]]]>
                     </db:input-parameters>
                </db:update>
                <logger doc:name="Logger" message='#["Phone number in Database successfully updated"]' />
                <set-variable doc:name="Set ReturnMessageDB" value='#["Phone number in Database successfully updated. "]' variableName="ReturnMessageDB" />
           </otherwise>
      </choice>