聚合for-each循环的数据

时间:2015-02-18 21:52:08

标签: mule

场景 - 将csv文件转换为json格式,获取每个json元素并进行get请求api调用。我在for-each循环序列中这样做。我得到一个json响应(从每个提取eventId和成本)。现在,我希望在主标题列表下将所有这些响应结合在一起,并制作更大的json有效负载。

例如:

{
   "listings": [
          {
           "eventId":"8993478",
           "cost":34
          },
          {
           "eventId":"xxxxxyyyy",
           "cost":zz
          },
   ]
}

我如何为所有迭代条目执行此操作。我可以为一个条目(使用groovy脚本)执行此操作。

3 个答案:

答案 0 :(得分:3)

您可以在for-each循环之前将变量定义为空列表,其中包含:

<set-variable variableName="listings" value="#[[]]" />

然后,在for-each循环内的每次迭代中,将元素添加到上一个变量:

<expression-transformer expression="#[flowVars.listings.add(flowVars.iterationMap)]" />

在前面的代码片段中,我使用变量flowVars.iterationMap来表示每次迭代时生成的映射。

最后,如果需要,您可以在set-payload循环后添加for-each转换器:

<set-payload value="#[flowVars.listings]" />

HTH,马科斯

答案 1 :(得分:0)

您可以使用批处理模块,但您必须重写此逻辑稍有不同。例如,您将无法再像Marcos建议的那样使用聚合flowVar。相反,您需要使用固定大小的批处理:提交块(在许多方面实际上会更好,例如,您可以开始向远程API发送批量数据,同时仍然在后台处理其他一些记录)。

答案 2 :(得分:0)

...我喜欢Marco的答案,它对我的​​用例非常有用。

只需在流变量中创建一个数组,并在ForEach范围内的数组上使用add()方法就可以了。xt / p>

OP跟进问题很好。它促使我使用建议的方法进行替代测试。在这里查看我的两个流程:

<flow name="sampleAggregatorFlow" doc:description="this is a simple demo that shows how to aggregate results into an accumulator array">
       <http:listener config-ref="manage-s3-api-httpListenerConfig" path="/aggregate" allowedMethods="GET" doc:name="HTTP"/>
       <set-payload value="#[['red','blue','gold']]" doc:name="Set Payload"/>
       <set-variable variableName="accumulator" value="#[[]]" doc:name="accumulator"/>
       <foreach doc:name="For Each">
          <expression-transformer expression="#[flowVars.accumulator.add(payload)]" doc:name="addEm"/>
       </foreach>
       <set-payload value="#[flowVars.accumulator]" doc:name="Set Payload"/>
    <json:object-to-json-transformer doc:name="Object to JSON"/>
</flow>
<flow name="Copy_of_sampleAggregatorFlow" doc:description="this is a simple demo that shows how to aggregate results into an accumulator array">
    <http:listener config-ref="manage-s3-api-httpListenerConfig" path="/aggregate2" allowedMethods="GET" doc:name="Copy_of_HTTP"/>
    <set-payload value="#[['red','blue','gold']]" doc:name="Copy_of_Set Payload"/>
    <set-variable variableName="accumulator" value="#[new java.util.ArrayList()]" doc:name="Copy_of_accumulator"/>
    <foreach doc:name="Copy_of_For Each">
        <expression-transformer expression="#[flowVars.accumulator.add(payload)]" doc:name="Copy_of_addEm"/>
    </foreach>
    <set-payload value="#[flowVars.accumulator]" doc:name="Copy_of_Set Payload"/>
    <json:object-to-json-transformer doc:name="Copy_of_Object to JSON"/>
</flow>

两种流动产生了相同的结果:

[
  "red",
  "blue",
  "gold"
]

使用Anypoint Studio 6.4.1和Mule Runtime 3.9进行测试12/26/2017