迭代调解器现在按顺序工作,顺序=“true”

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

我有这个输入

<uList>
    <user>
      <id>12</id>
    </user>
    <user>
      <id>13</id>
    </user>
    <user>
      <id>14</id>
    </user>
    <user>
      <id>15</id>
    </user>
</uList>

我想迭代这个列表并调用 scim GET API。但我想按顺序执行此操作。 (一一API调用)

我使用了下面的迭代中介。但它仍然并行工作。这是什么问题?

 <iterate expression="//*[local-name()='user']" sequential="true">
              <target>
                 <sequence>
                    <property name="uri.var.uuid" expression="//*[local-name()='scimId']" scope="default" type="STRING"/>
                    <log level="custom">
                       <property name="uri.var.uuid" expression="//*[local-name()='scimId']"/>
                    </log>
                    <property name="NO_ENTITY_BODY" value="true" scope="axis2" type="BOOLEAN"/>
                    <header name="Content-Type" scope="transport" action="remove"/>
                    <call>
                       <endpoint>
                          <http method="GET" uri-template="https://run.mocky.io/v3/ebc2eef8-6012-4fbb-b0b5-d063b68c6400"/>
                       </endpoint>
                    </call>
                    <property name="userName" expression="json-eval($.userName)" scope="default" type="STRING"/>
                    <payloadFactory media-type="json">
                       <format>{"responses":{ "username":"$1", "scimId":"$2"}}</format>
                       <args>
                          <arg evaluator="xml" expression="$ctx:userName"/>
                          <arg evaluator="xml" expression="$ctx:uri.var.uuid"/>
                       </args>
                    </payloadFactory>
                    <script language="js">java.lang.Thread.sleep(5000);</script>
                 </sequence>
              </target>
           </iterate>
iterator wso2 wso2-micro-integrator
2个回答
0
投票

尝试通过在

blocking="true"
中设置标志
Call Mediator
来执行阻塞调用。

<call blocking="true">
   <endpoint>
      <address uri="http://localhost:9000/services/SimpleStockQuoteService" />
   </endpoint>
</call>

0
投票

您面临的问题可能是由于尽管您在迭代中介器中设置了顺序=“true”,但迭代内的HTTP调用仍然同时发生,因为调用中介器的默认行为是异步的。

要使 HTTP 调用在迭代中按顺序进行,您需要显式地使它们阻塞调用。您可以通过向呼叫中介添加 blocking="true" 属性来实现此目的。

如果您在迭代中介器中使用阻塞调用中介器,则流程确实会等待每次迭代完成,然后再继续下一步。在这种情况下,如果您想要聚合每次迭代的响应,您将无法在迭代中介器之后直接执行此操作,因为在所有迭代完成之前,流程不会到达那里。

为了解决这个问题,您可以在每次迭代中使用 loopback 调解器将响应发送回输出序列,您可以在所有迭代完成后聚合响应。

以下是修改序列的方法。

<sequence>
    <iterate expression="//*[local-name()='user']" sequential="true">
        <target>
            <sequence>
                <!-- Your existing logic for making HTTP call -->
                <!-- Remember to set blocking="true" in the call mediator -->
                <call blocking="true">
                    <endpoint>
                        <http method="GET" uri-template="https://run.mocky.io/v3/ebc2eef8-6012-4fbb-b0b5-d063b68c6400"/>
                    </endpoint>
                </call>
                <!-- Store response in a property -->
                <property name="responseBody" expression="$body" scope="default" type="STRING"/>
                <!-- Loopback mediator to send response back to main sequence -->
                <loopback/>
            </sequence>
        </target>
    </iterate>
    
    <!-- Aggregate responses after all iterations are complete -->
    <aggregate>
        <completeCondition>
            <messageCount min="-1" max="-1"/>
        </completeCondition>
        <onComplete expression="//responseBody">
            <!-- Your aggregation logic here -->
        </onComplete>
    </aggregate>
</sequence>
© www.soinside.com 2019 - 2024. All rights reserved.