Mulesoft 异步发送多个查询并等待响应

问题描述 投票:0回答:1

需要帮助加快骡流。

现在我有 4 个疑问需要询问。前 3 个查询彼此不依赖,因此我想异步执行这 3 个查询。一旦他们全部 3 完成,我想将结果传递给 4the 查询。现在这些 api 请求需要 2-4 秒(通过邮递员),我希望这会加快速度。

查询很简单,而且是英文,

  1. 获取recordTypeId
  2. 获取recordTypeId
  3. 获取帐户信息,其中 pin == 请求查询项
  4. 获取 recordTypeId == recordTypeId's(前 2 个查询)和 accountLookup == account Id(第三个查询)的情况

我遇到的问题是将 3 个查询放入一个异步块中。并等待他们完成后再进行第四次查询。

我尝试使用直到成功块,但这似乎不起作用。

现在我有以下代码

<! -- Goal here is to make the following 3 queries at the same time. -->

<async doc:name="Async" doc:id="4c25219e-d163-4fa2-b8cf-51e13eb020c5">
    <salesforce:query doc:name="get support case record id" doc:id="4c5955f0-484f-4fc1-ad6b-981c367b825e" config-ref="qapartial" targetValue="#[payload[0].Id]" target="supportCaseRecordTypeId">
        <salesforce:salesforce-query><![CDATA[SELECT Id FROM RecordType WHERE SObjectType = 'Case' AND DeveloperName = 'SUPPORT']]></salesforce:salesforce-query>
    </salesforce:query>
                                
    <salesforce:query doc:name="get app support case record type Id" doc:id="c7490429-736e-4fb1-8ec1-c74c2e59e631" config-ref="qapartial" target="appSupportCaseRecordTypeId" targetValue="#[payload[0].Id]">
        <salesforce:salesforce-query><![CDATA[SELECT Id FROM RecordType WHERE SObjectType = 'Case' AND DeveloperName = 'SUPPORT_TICKET_FROM_APP']]></salesforce:salesforce-query>
    </salesforce:query>

    <salesforce:query doc:name="get account Id from pin" doc:id="ccc565b8-88c8-45c5-9b9e-fc474d3da81f" config-ref="qapartial" target="accountId" targetValue="#[payload[0].Id]">
        <salesforce:salesforce-query><![CDATA[SELECT Id, pin__c
       FROM Account
       WHERE pin__c = ':customerPin']]></salesforce:salesforce-query>
        <salesforce:parameters><![CDATA[#[output application/java
            ---
            {
            customerPin : vars.pin
            }]]]></salesforce:parameters>
    </salesforce:query>
</async>


<! -- Goal here is to run this code AFTER the 3 queries finish. -->

<salesforce:query doc:name="get case records" doc:id="f0aed7fb-f47d-4392-b5b8-95993d0bba7e" config-ref="qapartial">
    <salesforce:salesforce-query><![CDATA[SELECT Id FROM Case  WHERE AccountId = ':accountId' AND
     (
        (RecordTypeId = ':appSupportCaseRecordId' AND Origin = 'App') OR 
        (RecordTypeId = ':supoprtCasesRecordId' AND 
                (Origin = 'Email' OR 
                 Origin = 'Phone' OR 
                 Origin = 'Web')) 
      )]]></salesforce:salesforce-query>
                            <salesforce:parameters><![CDATA[#[output application/java
        ---
        {
        accountId : vars.accountId,
        supoprtCasesRecordId : vars.supportCaseRecordTypeId,
        appSupportCaseRecordId : vars.appSupportCaseRecordTypeId
        }]]]>
    </salesforce:parameters>
</salesforce:query>
xml mulesoft anypoint-studio anypoint-platform
1个回答
0
投票

我怀疑异步的工作原理存在混乱。 文档说:

由于 Async 作用域以“即发即忘”的方式执行,因此该作用域内的处理结果在主流程中不可用。

这意味着你不能使用异步来取回结果。另请注意,异步范围内的 3 个查询是依次执行的。它不会并行化内部的步骤。

如果您想收到结果,您可以:

  1. 使用队列之类的东西,例如VM队列,将结果发送到另一个流。异步之后的查询应移动到一个单独的私有流,该流将由 VM 队列侦听器触发,等待 VM 从异步路由器发送 3 个查询的结果。
  2. 或者使用 Scatter/Gather 范围并行执行 3 个查询,然后收集第 4 个查询的 3 个路由的结果。
© www.soinside.com 2019 - 2024. All rights reserved.