Mule从ConsumerIterator获取数据

时间:2015-06-22 20:13:32

标签: mule

我的骡子流是:

<sfdc:query config-ref="SFDC__DevInt" query="dsql:SELECT Id FROM Account WHERE Name = #[flowVars.Name]" doc:name="Salesforce"/>
<logger message="Select query: #[message.payload]" level="INFO" doc:name="Logger"/>
<foreach doc:name="For Each">     
  <logger message="#[message.payload]" level="INFO" doc:name="Logger"/>
  <logger message="#[message.payload.Id]" level="INFO" doc:name="Logger"/>
</foreach>

以上for循环返回id。而不是循环是否有任何直接的方式获取数据作为迭代器对象?即我需要获得id的值。 for循环中的数据返回:

SFDC:Select query: org.mule.streaming.ConsumerIterator@2f23abf
INFO  2015-06-22 13:10:25,520 
{Id=0011100000uPbqeAAC, type=Account}

我将获得单一数据。

我试过#[message.payload.iterator()。hasNext()。next()],但是得到了

Message               : Execution of the expression "message.payload.iterator().hasNext().next()" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: ConsumerIterator
Code                  : MULE_ERROR--2

2 个答案:

答案 0 :(得分:8)

sfdc:query之后的消息有效负载是org.mule.streaming.ConsumerIterator的实例,它实现java.util.Iterator。因此,没有理由在其上调用iterator() 已经是迭代器。

此外hasNext返回一个布尔值,而不是Iterator个实例,因此您无法像调用链接那样进行调用。

因此,你的表达应该是:

#[message.payload.hasNext() ? message.payload.next() : null]

假设null是枚举为空时所需的值。

答案 1 :(得分:2)

如果需要使用for-each

,也可以将迭代器转换为列表

#[org.apache.commons.collections.IteratorUtils.toList(payload)]