Mule 为每个循环聚合来自的数据

Mule 为每个循环聚合来自的数据,mule,Mule,场景-将csv文件转换为json格式,获取每个json元素并进行get请求api调用。我在一个for-each循环序列中这样做。我得到一个json响应(从每个响应中提取eventId和成本)。现在,我希望将所有这些响应合并到主标题列表下,并生成更大的json负载 例如: { "listings": [ { "eventId":"8993478", "cost":34 }, {

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

例如:

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

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

您可以在
之前为每个
循环定义一个变量,作为一个空列表,其中包含:

<set-variable variableName="listings" value="#[[]]" />
在前面的代码片段中,我使用变量
flowVars.iterationMap
来表示每次迭代时生成的映射

最后,如果需要,您可以在每个循环的
之后添加一个
设置有效负载
转换器:

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


HTH,Marcos

您可以在每个
循环的
前面定义一个变量,作为一个空列表,其中包含:

<set-variable variableName="listings" value="#[[]]" />
在前面的代码片段中,我使用变量
flowVars.iterationMap
来表示每次迭代时生成的映射

最后,如果需要,您可以在每个
循环的
之后添加一个
设置有效负载
转换器:

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


HTH,Marcos

您可以在每个
循环的
前面定义一个变量,作为一个空列表,其中包含:

<set-variable variableName="listings" value="#[[]]" />
在前面的代码片段中,我使用变量
flowVars.iterationMap
来表示每次迭代时生成的映射

最后,如果需要,您可以在每个
循环的
之后添加一个
设置有效负载
转换器:

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


HTH,Marcos

您可以在每个
循环的
前面定义一个变量,作为一个空列表,其中包含:

<set-variable variableName="listings" value="#[[]]" />
在前面的代码片段中,我使用变量
flowVars.iterationMap
来表示每次迭代时生成的映射

最后,如果需要,您可以在每个
循环的
之后添加一个
设置有效负载
转换器:

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


嗯,Marcos

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

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

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

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

…我喜欢Marco的答案,它对我的用例非常有效

只需在流变量中创建一个数组,并在ForEach作用域中对该数组使用add()方法即可

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>

2017年12月26日,使用Anypoint Studio 6.4.1和Mule Runtime 3.9进行了测试。我喜欢Marco的答案,它非常适合我的用例

只需在流变量中创建一个数组,并在ForEach作用域中对该数组使用add()方法即可

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>

2017年12月26日,使用Anypoint Studio 6.4.1和Mule Runtime 3.9进行了测试。我喜欢Marco的答案,它非常适合我的用例

只需在流变量中创建一个数组,并在ForEach作用域中对该数组使用add()方法即可

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>

2017年12月26日,使用Anypoint Studio 6.4.1和Mule Runtime 3.9进行了测试。我喜欢Marco的答案,它非常适合我的用例

只需在流变量中创建一个数组,并在ForEach作用域中对该数组使用add()方法即可

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>

2017年12月26日使用Anypoint Studio 6.4.1和Mule Runtime 3.9进行的测试请整理格式。把你的问题说清楚,这是最帮不上忙的。显示您的流程。请整理格式。把你的问题说清楚,这是最帮不上忙的。显示您的流程。请整理格式。把你的问题说清楚,这是最帮不上忙的。显示您的流程。请整理格式。把你的问题说清楚,这是最帮不上忙的。显示您的流。我是否可以将变量值设置为value=“#[new java.util.ArrayList()”,而不是将其设置为#[[])