Mule从ConsumerIterator获取数据

Mule从ConsumerIterator获取数据,mule,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:na

我的骡子流是:

<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>
一次我将获得单个数据

我尝试了使用#[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
的一个实例,它实现了。因此,没有理由对它调用
iterator()
,它已经是一个迭代器了

此外,
hasNext
返回一个布尔值,而不是一个
迭代器
实例,因此不能像以前那样链接调用

因此,你的表达应该是:

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

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

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

此外,
hasNext
返回一个布尔值,而不是一个
迭代器
实例,因此不能像以前那样链接调用

因此,你的表达应该是:

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

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

如果需要为每个枚举使用迭代器,也可以将迭代器转换为列表


#[org.apache.commons.collections.IteratorUtils.toList(有效负载)]

如果需要对每个迭代器使用,还可以将迭代器转换为列表


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

#[message.payload.hasNext()?message.payload.next().get('Id'):null]返回Id值。还有一个问题,上面的流在for循环中,如果message.payload.hasNext()的值为null,如何继续?即,如果为空,则for循环应继续到下一个值。
foreach
没有提前退出的条件(请参阅)。我建议您使用MEL
表达式组件来实现更丰富的流控制。我将其设置为:#[message.payload.hasNext()?message.payload.next():'none']。这样可以避免将有效负载设置为null,从而导致批处理步骤中出现问题。我被击中了,对此有何想法#[message.payload.hasNext()?message.payload.next().get('Id'):null]返回Id值。还有一个问题,上面的流在for循环中,如果message.payload.hasNext()的值为null,如何继续?即,如果为空,则for循环应继续到下一个值。
foreach
没有提前退出的条件(请参阅)。我建议您使用MEL
表达式组件来实现更丰富的流控制。我将其设置为:#[message.payload.hasNext()?message.payload.next():'none']。这样可以避免将有效负载设置为null,从而导致批处理步骤中出现问题。我被击中了,对此有何想法?我也有类似的场景,在foreach内部需要捕获id,并且需要对每个id再调用salesfors,但我得到以下错误:执行表达式“message.payload.hasNext()?message.payload.next().get('id'):null”失败。根异常堆栈跟踪:[UnexpectedErrorFault[ApiFault exceptionCode='INVALID_OPERATION_WITH_EXPIRED_PASSWORD'exceptionMessage='用户密码已过期,您必须在尝试任何其他API操作之前调用SetPassword'extendedErrorDetails='{[0]}']]–我也有类似的场景,在foreach内部需要捕获id,并且需要对每个id再调用salesfors,但我得到以下错误:执行表达式“message.payload.hasNext()?message.payload.next()。get('id'):null”失败。根异常堆栈跟踪:[UnexpectedErrorFault[ApiFault exceptionCode='INVALID_OPERATION_WITH_EXPIRED_PASSWORD'exceptionMessage='用户密码已过期,您必须在尝试任何其他API操作之前调用SetPassword'extendedErrorDetails='{[0]}']]-