我有这个输入
<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>
尝试通过在
blocking="true"
中设置标志 Call Mediator
来执行阻塞调用。
<call blocking="true">
<endpoint>
<address uri="http://localhost:9000/services/SimpleStockQuoteService" />
</endpoint>
</call>
您面临的问题可能是由于尽管您在迭代中介器中设置了顺序=“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>