Microsoft Dynamics CRM Connector 3.2 - Mule 4

Microsoft Dynamics CRM 用 Anypoint Connector を使用して、Mule アプリケーションは Microsoft Dynamics CRM の SOAP 組織サービスとやりとりすることができます。

互換性と解決された問題に関する情報は、リリースノートを参照してください。

始める前に

このコネクタを使用するには、以下に精通している必要があります。

  • Microsoft Dynamics CRM API

  • Anypoint Connector

  • Mule Runtime Engine (Mule)

  • Mule フローの要素とグローバル要素

  • Anypoint Studio (Studio) を使用した Mule アプリケーションの作成方法

アプリケーションを作成する前に、対象リソースへの接続をテストするには、Microsoft Dynamics CRM の SOAP 組織サービスのログイン情報が必要です。

Microsoft CRM インスタンスで作成された Web サービスヘッダーの作成日または期限切れ日は、Web サービスの基本セキュリティプロファイル検証 (​http://www.ws-i.org/Profiles/BasicSecurityProfile-1.0.html​) で規定された制約に準拠する必要があります。その概要を次に示します。

  • 作成日または期限切れ日には、小数点以下が 3 桁 (ミリ秒) を超える秒値を含めることはできません。

  • 秒値を含む作成日または期限切れ日では、60 未満の秒値を指定する必要があります。

  • 作成日または期限切れ日に ValueType 属性を含めることはできません。

  • 作成日または期限切れ日には、XML スキーマ種別 (dateTime) で指定された UTC 形式の時間値を含める必要があります。

POM ファイルの連動関係の追加

<dependency>
  <groupId>com.mulesoft.connectors</groupId>
  <artifactId>mule-microsoft-dynamics-crm-connector</artifactId>
  <version>x.x.x</version>
  <classifier>mule-plugin</classifier>
</dependency>

x.x.x​ を使用しているコネクタに対応するバージョンに置き換えます。

最新の ​pom.xml​ ファイル情報を取得する手順は、次のとおりです。

  1. Anypoint Exchange​ に移動します。

  2. Exchange で、​[Login (ログイン)]​ をクリックし、Anypoint Platform のユーザー名とパスワードを指定します。

  3. Exchange で、「​<connector-name>​」を検索します。

  4. コネクタを選択します。

  5. 画面の右上付近にある ​[Dependency Snippets (連動関係スニペット)]​ をクリックします。

Design Center での接続

  1. Design Center で、HTTP リスナーやスケジューラーなどのトリガーをクリックします。

  2. グローバル要素 (省略可能) を作成するには、[Reusable Configurations (再利用可能な設定)] をクリックし、次のオプションを設定します。

    • Username (ユーザー名): Dynamics CRM のユーザー名を入力します。

    • Password (パスワード): 対応するパスワードを入力します。

    • Organization Service URL (組織サービスの URL): 対応する組織サービスの URL を入力します。

    • Authentication retries (認証の再試行): 認証を再試行する回数を入力します。

    • Disable cn check (CN チェックを無効化): SSL 証明書をスキップするかどうかを選択します。

      Design Center のグローバル要素の [General (一般)] タブ
  3. プラス記号を選択して、コンポーネントを追加します。

  4. コンポーネントとしてコネクタを選択します。

  5. 次の項目を設定します。

    Create:

    • Logical Name (論理名) - エンティティの論理名

    • Attributes (属性) - ​Map<String, Object>​ としてのレコードの属性。

      Design Center での Create (作成) の設定

      Query:

    • Logical Name (論理名) - エンティティの論理名。

    • Id* - 更新するレコードの ID。

    • Attributes (属性) - ​Map<String, Object>​ としての更新する属性。

      Design Center での Update (更新) の設定

      Delete:

    • Logical Name (論理名) - エンティティの論理名。

    • Id (ID) - 削除するレコードの ID。

      Design Center での Delete (削除) の設定

      Retrieve:

      • Logical Name (論理名) - エンティティの論理名。

      • Id (ID) - 取得するレコードの ID。

      • Attributes (属性) - ​Map<String, Object>​ としての指定エンティティの属性。

        Design Center での Retrieve (取得) の設定

        Retrieve Multiple By Query (クエリで複数を取得):

    • Query (クエリ) - DataSense クエリ言語の場合は、DSQL クエリ。ネイティブクエリ言語の場合は、Fetch XML クエリ。

    • Items Per Page (1 ページあたりの項目数) - ページごとに返される項目の数。

    • Single Page Number (単一ページ番号) - 0 より大きい場合、その特定のページのみを返します。

      Design Center での Retrieve Multiple (複数を取得) の設定

      Associate (関連付け):

    • Logical Name (論理名) - エンティティの論理名。

    • Id* - 関連レコードに関連付けられるレコードの ID。

    • Relationship Entity Role Is Referenced (リレーションエンティティロールが参照される):

      • false: 関連付けるレコードを主エンティティレコードが参照している場合。

      • true: 関連付けるレコードによって主エンティティレコードが参照されている場合。

        Design Center での Associate (関連付け) の設定

        Execute (実行):

    • Request Name (要求名) - 実行する要求の論理名。

    • Request Parameters (要求パラメーター) - [非推奨] このパラメーターは設定から削除される予定です。コネクタをコールする前に、#[payload] を正しく設定してください。

    • Request Id (要求 ID) - 実行する要求の ID。

      Design Center での Execute (実行) の設定

Studio プロジェクトへのコネクタの追加

Anypoint Studio には、Studio プロジェクトにコネクタを追加する 2 つの方法があります。Studio タスクバーの Exchange ボタンから追加するか、[Mule Palette (Mule パレット)] ビューから追加します。

  1. Studio で Mule プロジェクトを作成します。

  2. [Mule Palette (Mule パレット)]​ ビューで、​[(X) Search in Exchange ((X) Exchange 内を検索)]​ をクリックします。

  3. [Add Modules to Project (モジュールをプロジェクトに追加)]​ で、検索項目に「​crm​」と入力します。

  4. [Available modules (使用可能なモジュール)]​ で、このコネクタの名前をクリックします。

  5. [Add (追加)]​ をクリックします。

  6. [Finish (完了)]​ をクリックします。

Studio でコネクタを設定する

  1. コネクタを Studio キャンバスにドラッグします。

  2. コネクタのグローバル要素を作成するには、次の項目を設定します。

    Online Authentication (Default) (オンライン認証 (デフォルト)):

    • Username (ユーザー名): Dynamics CRM のユーザー名を入力します。

    • Password (パスワード): 対応するパスワードを入力します。

    • Organization Service URL (組織サービスの URL): 対応する組織サービスの URL を入力します。

    • Authentication retries (認証の再試行): 認証を再試行する回数を入力します。

    • Disable cn check (CN チェックを無効化): SSL 証明書をスキップするかどうかを選択します。

      ログイン情報の設定

ユースケース - Microsoft Dynamics CRM の操作のデモ

このデモには、次のオプションが含まれています。

  • すべての取引先を返す: http://localhost:8081/accounts

  • サブ文字列が含まれる名前で取引先を照会する: http://localhost:8081/query-accounts?name=li

  • 指定した名前で新規取引先を作成する: http://localhost:8081/create-account?name=your-account-name

  • ID で取引先を取得する: http://localhost:8081/retrieve-account?accountid={account-guid}

  • 取引先を削除する: http://localhost:8081/delete-account?accountid={account-guid}

  • すべての取引先責任者を返す: http://localhost:8081/contacts

  • 取引先のすべての取引先責任者を返す: http://localhost:8081/contacts-by-account?accountid={account-guid}

  • 取引先責任者を取引先に関連付ける: http://localhost:8081/associate?accountid={account-guid}&contactid={contact-guid}

  • 取引先から取引先責任者の関連付けを解除する: http://localhost:8081/disassociate?accountid={account-guid}&contactid={contact-guid}

  • 商談を作成する: http://localhost:8081/create-opportunity?accountid={account-guid}&contactid={contact-guid}

  • 親取引先で商談を照会する: http://localhost:8081/opportunities-by-account?accountid={account-guid}

  • SetState​ 操作を実行して取引先をアクティブ化する: http://localhost:8081/activate-account?accountid={account-guid}

  • SetState​ 操作を実行して取引先を非アクティブ化する: http://localhost:8081/deactivate-account?accountid={account-guid}

  • 1 回の要求で複数のエンティティを作成する: http://localhost:8081/create-multiple

  • 1 回の要求で複数の取引先責任者の [Description (説明)] プロパティを更新する: http://localhost:8081/update-multiple

  • 更新された取引先責任者を取得する: http://localhost:8081/updated-contacts

  • 1 回の要求で複数の取引先責任者を削除する: http://localhost:8081/delete-multiple

ユースケースの Studio ビジュアルフロー

ms dynamics crm demo 01
ms dynamics crm demo 02
ms dynamics crm demo 03
ms dynamics crm demo 04
ms dynamics crm demo 05

ユースケースの XML フロー

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

<mule xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core"
    xmlns:microsoft-dynamics-crm="http://www.mulesoft.org/schema/mule/microsoft-dynamics-crm"
    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/microsoft-dynamics-crm
    http://www.mulesoft.org/schema/mule/microsoft-dynamics-crm/current/mule-microsoft-dynamics-crm.xsd
    http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.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>
    <microsoft-dynamics-crm:dynamics-crm-config
        name="Microsoft_Dynamics_CRM_Dynamics_CRM"
        doc:name="Microsoft Dynamics CRM Dynamics CRM" >
        <microsoft-dynamics-crm:online-connection
            username="${username}"
            password="${password}"
            organizationServiceUrl="${organizationServiceUrl}"
            authenticationRetries="${authenticationRetries}" />
    </microsoft-dynamics-crm:dynamics-crm-config>
    <flow name="crm-all-accounts"  >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/accounts"/>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[dsql:SELECT accountid,name,statecode,statuscode FROM account]]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-query-account-by-name"  >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/query-accounts"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    "query" : "dsql:SELECT accountid,name,statecode,statuscode FROM account WHERE name LIKE '%" ++ attributes.queryParams.name ++ "%'"
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[#[payload.query]]]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-create-account" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/create-account"/>
        <ee:transform doc:name="Transform Message"  >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    "name": attributes.queryParams.name
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:create
            logicalName="account"
            doc:name="Create"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-delete-account"
        config-ref="HTTP_Listener_config"
        path="/delete-account"/>
        <microsoft-dynamics-crm:delete
            logicalName="account"
            id="#[attributes.queryParams.accountid]"
            doc:name="Delete"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM" />
    </flow>
    <flow name="crm-retrieve-account" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/retrieve-account"/>
        <microsoft-dynamics-crm:retrieve
            logicalName="account"
            id="#[attributes.queryParams.accountid]"
            doc:name="Retrieve"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM" />
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-all-contacts" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/contacts"/>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[dsql:SELECT accountid,contactid,firstname,lastname FROM contact]]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-get-associated-contacts" >
        <http:listener doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/contacts-by-account"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    "query" : "dsql:SELECT contactid, accountidname, parentcustomerid_referenceto_account FROM contact WHERE parentcustomerid_referenceto_account = '" ++ attributes.queryParams.accountid ++ "'"
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[#[payload.query]]]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-associate-contact-to-account" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/associate"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[
    attributes.queryParams.contactid
]]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:associate
            logicalName="account"
            relatedEntitiesIds="#[payload]"
            doc:name="Associate"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"
            relationshipSchemaName="contact_customer_accounts"
            id="#[attributes.queryParams.accountid]"
            relationshipEntityRoleIsReferenced="true"/>
    </flow>
    <flow name="crm-disassociate-contact-to-account" >
        <http:listener doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/disassociate"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[
    attributes.queryParams.contactid
]]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:disassociate
            doc:name="Disassociate"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"
            logicalName="account"
            id="#[attributes.queryParams.accountid]"
            relationshipEntityRoleIsReferenced="true"
            relationshipSchemaName="contact_customer_accounts"
            relatedEntitiesIds="#[payload]"/>
    </flow>
    <flow name="crm-get-opportunities" >
        <http:listener doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/opportunities-by-account"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    "query" : "dsql:SELECT accountid_referenceto_account,accountidname,customerid_referenceto_contact,name,parentaccountid_referenceto_account FROM opportunity WHERE parentaccountid_referenceto_account = '" ++ attributes.queryParams.accountid ++ "'"
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[#[payload.query]]]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-create-opportunity" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/create-opportunity"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    "parentaccountid_referenceto_account": attributes.queryParams.accountid,
    "contactid_referenceto_contact": attributes.queryParams.contactid,
    "name": "unique opportunity",
    "timeline": 2
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:create
            logicalName="opportunity"
            doc:name="Create"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-execute-activate-account" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/activate-account"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
{
    "entityMoniker": {
        "id": {
            "value": attributes.queryParams.accountid,
        },
        "logicalName": "account"
    },
    "state": {
        "value": 0
    },
    "status": {
        "value": 1
    }
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:execute
            requestName="SetState" doc:name="Execute"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-execute-deactivate-account" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/deactivate-account"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
{
    "entityMoniker": {
        "id": {
            "value": attributes.queryParams.accountid,
        },
        "logicalName": "account"
    },
    "state": {
        "value": 1
    },
    "status": {
        "value": 2
    }
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:execute
            doc:name="Execute"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"
            requestName="SetState"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-create-multiple-contacts" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/create-multiple"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
[
    {
      "fullname":"Contact1",
      "address1_city":"DemoCity",
      "description":"Demo contact 1"
    },
    {
      "fullname":"Contact2",
      "address1_city":"DemoCity",
      "description":"Demo contact 2"
    },
    {
      "fullname":"Contact3",
      "address1_city":"DemoCity",
      "description":"Demo contact 3"
    }
]]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:create-multiple
            logicalName="contact"
            doc:name="Create multiple"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-delete-multiple" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/delete-multiple"/>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[dsql:SELECT contactid FROM contact WHERE address1_city = 'DemoCity']]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
payload.*contactid
]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:delete-multiple
            logicalName="contact"
            ids="#[payload]"
            doc:name="Delete multiple"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-update-multiple-contacts" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/update-multiple"/>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[dsql:SELECT contactid,description FROM contact WHERE address1_city = 'DemoCity']]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
updates: payload map (item, index) -> {
      "contactid" : item.contactid,
      "description" : "Updated Description"
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:update-multiple
            logicalName="contact"
            doc:name="Update multiple"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:list-of-attributes ><![CDATA[#[payload.updates]]]></microsoft-dynamics-crm:list-of-attributes>
        </microsoft-dynamics-crm:update-multiple>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-retrieve-update-contacts" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/updated-contacts"/>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[dsql:SELECT contactid,description FROM contact WHERE address1_city = 'DemoCity']]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
</mule>