Mule 从 ConsumerIterator 获取数据

Mule getting data from ConsumerIterator

我的 mule flow 是:

<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 循环 returns id。除了循环之外,还有什么直接的方法可以将数据作为迭代器对象获取吗?即我需要获取 id 的值。 for 循环中的数据 returns:

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

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

此外 hasNext returns 布尔值,而不是 Iterator 实例,因此您不能像以前那样链接调用。

因此你的表达应该是:

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

假设 null 是您想要的值,以防枚举为空。

如果需要使用也可以把iterator转成listfor-each

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