我对Mule相当新,使用3.3.0,但我正在尝试我认为应该是一个相当有实力的例子。 我有一个mule配置,它将读取csv文件并尝试处理不同流异步中的行和列。但是,当消息被“切换”到其中一个异步流时,我们看到ConcurrentModificationException。我想知道是否有其他人已经看到了这个问题以及他们为解决这个问题可能做了些什么。
java.util.ConcurrentModificationException at org.apache.commons.collections.map.AbstractHashedMap $ HashIterator.nextEntry(AbstractHashedMap.java:1113) at org.apache.commons.collections.map.AbstractHashedMap $ KeySetIterator.next(AbstractHashedMap.java:938) 在org.mule.DefaultMuleEvent.setMessage(DefaultMuleEvent.java:933) 在org.mule.DefaultMuleEvent。(DefaultMuleEvent.java:318) 在org.mule.DefaultMuleEvent。(DefaultMuleEvent.java:290) 在org.mule.DefaultMuleEvent.copy(DefaultMuleEvent.java:948)
<queued-asynchronous-processing-strategy poolExhaustedAction="RUN" name="commonProcessingStrategy" maxQueueSize="1000" doc:name="Queued Asynchronous Processing Strategy"/>
<file:connector name="inboundFileConnector" fileAge="1000" autoDelete="true" pollingFrequency="1000" workDirectory="C:/mule/orca/dataprovider/work"/>
<file:endpoint name="dataProviderInbound" path="C:\mule\orca\dataprovider\inbound" moveToPattern="#[function:datestamp]-#[header:originalFilename]" moveToDirectory="C:\mule\orca\dataprovider\history" connector-ref="inboundFileConnector" doc:name="Data Feed File" doc:description="new files are processed in 'work' folder, then moved to 'archive' folder"/>
<flow name="dataProviderFeedFlow">
<inbound-endpoint ref="dataProviderInbound"/>
<file:file-to-string-transformer />
<flow-ref name="dataSub"/>
</flow>
<sub-flow name="dataSub" >
<splitter expression="#[rows=org.mule.util.StringUtils.split(message.payload, '\n\r')]" />
<expression-transformer expression="#[org.mule.util.StringUtils.split(message.payload, ',')]" />
<foreach>
<flow-ref name="storageFlow" />
<flow-ref name="id" />
</foreach>
</sub-flow>
<flow name="storageFlow" processingStrategy="commonProcessingStrategy">
<logger level="INFO" message="calling the 'storageFlow' sub flow."/>
</flow>
<flow name="id" processingStrategy="commonProcessingStrategy">
<logger level="INFO" message="calling the 'id' sub flow."/>
</flow>
答案 0 :(得分:4)
以下是dataSub
子流的固定版本,可以正常工作:
<sub-flow name="dataSub">
<splitter expression="#[org.mule.util.StringUtils.split(message.payload, '\n\r')]" />
<splitter expression="#[org.mule.util.StringUtils.split(message.payload, ',')]" />
<flow-ref name="storageFlow" />
<all>
<async>
<flow-ref name="storageFlow" />
</async>
<async>
<flow-ref name="id" />
</async>
</all>
</sub-flow>
请注意:
all
消息处理器来确保将相同的有效负载发送到两个私有流async
消息处理器包装flow-ref,否则调用失败,因为私有流是异步的,但all
强制同步。